網站首頁 編程語言 正文
C語言數組循環右移
本題要求實現一個對數組進行循環右移的簡單函數:一個數組a中存有n(>0)個整數,將每個整數循環向右移m(≥0)個位置,即將a中的數據由(a0,a1,...,an?1)變為(an?m,...,an?1,a0,a1,...,an?m?1)即最后m個數循環移至最前面的m個位置)。
函數接口定義
int ArrayShift( int a[], int n, int m );
其中a[]是用戶傳入的數組;n是數組的大小;m是右移的位數。函數ArrayShift須將循環右移后的數組仍然存在a[]中。
裁判測試程序樣例
#include <stdio.h>
#define MAXN 10
int ArrayShift( int a[], int n, int m );
int main()
{
int a[MAXN], n, m;
int i;
scanf("%d %d", &n, &m);
for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);
ArrayShift(a, n, m);
for ( i = 0; i < n; i++ ) {
if (i != 0) printf(" ");
printf("%d", a[i]);
}
printf("\n");
return 0;
}
/* 你的代碼將被嵌在這里 */
輸入樣例:
6 2
1 2 3 4 5 6
輸出樣例:
5 6 1 2 3 4
解答:
int ArrayShift( int a[], int n, int m )
{
if(m>=n) m-=n; /*為了達到表內循環*/
int b[100];
for(int i=0;i<m;i++)
b[i]=a[n-m+i];
for(int i=0;i<n-m;i++)
b[i+m]=a[i];
for(int i=0;i<n;i++)
a[i]=b[i];
}
數組:如何把一個數組循環右移K位
問題描述
假設要把數組12345678右移2位,變為78123456。
分析
方法一:
比較移位前后數組序列的形式,不難看出,其中有兩段序列的順序是不變的,即就是 78 和 123456, 可以把這兩段看做兩個整體,右移k位就是把數組的兩部分交換一下。時間復雜度為O(n)
步驟:
1)逆序數組子序列123456,數組序列的形式為65432178
2)逆序數組子序列78, 數組序列的形式變為65432187
3)全部逆序, 數組序列的形式為78123456
代碼:
private void shift_k1(int[] a, int k) {
?? ??? ?int n = a.length;
?? ??? ?k = k % n;
?? ??? ?reverse(a,0,n-k-1);
?? ??? ?reverse(a,n-k,n-1);
?? ??? ?reverse(a,0,n-1);
?? ?}
private void reverse(int[] a, int i, int j) {
?? ??? ?for(; i<j; i++,j--){
?? ??? ??? ?int tmp = a[i];
?? ??? ??? ?a[i] = a[j];
?? ??? ??? ?a[j] = tmp;
?? ??? ?}
?? ?}
方法二:
使用arraylist來存儲k位后面的數,數組的前K位依次向后移動k位,最后將集合中的后k位數放到a的前k位中,注意對于K需要%a.length.
代碼:
private int[] shift_k(int[] a, int k) {
?? ??? ?k = k % a.length;
?? ??? ?if(k == 0){
?? ??? ??? ?return a;
?? ??? ?}
?? ??? ?ArrayList<Integer> q = new ArrayList<Integer>();
?? ??? ?for(int j=a.length-k; j<a.length; j++){
?? ??? ??? ?q.add(a[j]);
?? ??? ?}
?? ??? ?for(int i=a.length-k-1; i>=0; i--){
?? ??? ??? ?a[i+k] = a[i];
?? ??? ?}
?? ??? ?for(int i=0; i<k; i++){
?? ??? ??? ?a[i] = q.get(i);
?? ??? ?}
?? ??? ?return a;
?? ?}
原文鏈接:https://blog.csdn.net/tianty1121/article/details/107705246
相關推薦
- 2022-06-19 介紹C語言程序中的注釋等輔助語句如何使用_C 語言
- 2022-10-03 python接口自動化使用requests庫發送http請求_python
- 2022-07-14 Oracle中nvl()和nvl2()函數實例詳解_oracle
- 2022-10-08 C語言深入分析浮點型數據存儲_C 語言
- 2022-04-19 基于HarmonyOS的ArkUI編寫的社區類app(四)———倒計時控制和驗證碼登錄功能的實現
- 2022-08-03 Flutter實現切換應用時隱藏應用預覽_Android
- 2024-03-22 springboot報錯Error creating bean with name ‘dataSou
- 2023-03-19 教你如何實現在react項目中嵌入Blazor_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支