網站首頁 編程語言 正文
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-07-30 Redis?keys命令的具體使用_Redis
- 2022-08-10 Python進階學習修改閉包內使用的外部變量_python
- 2023-11-26 (有效解決)Android Studio 運行項目時報 Package install error:
- 2022-10-18 go日志庫中的logrus_Golang
- 2023-02-04 Rust?語言的全鏈路追蹤庫?tracing使用方法_Rust語言
- 2022-05-23 Python?圖形界面框架TkInter之在源碼中找pack方法_python
- 2022-07-23 Go語言學習筆記之文件讀寫操作詳解_Golang
- 2023-04-24 numpy.reshape()的函數的具體使用_python
- 最近更新
-
- 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同步修改后的遠程分支