C語言解讀數(shù)組循環(huán)右移問題
C語言數(shù)組循環(huán)右移
本題要求實現(xiàn)一個對數(shù)組進行循環(huán)右移的簡單函數(shù):一個數(shù)組a中存有n(>0)個整數(shù),將每個整數(shù)循環(huán)向右移m(≥0)個位置,即將a中的數(shù)據(jù)由(a0,a1,...,an−1)變?yōu)?an−m,...,an−1,a0,a1,...,an−m−1)即最后m個數(shù)循環(huán)移至最前面的m個位置)。
函數(shù)接口定義
int ArrayShift( int a[], int n, int m );
其中a[]是用戶傳入的數(shù)組;n是數(shù)組的大小;m是右移的位數(shù)。函數(shù)ArrayShift須將循環(huán)右移后的數(shù)組仍然存在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; /*為了達到表內(nèi)循環(huá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];
}
數(shù)組:如何把一個數(shù)組循環(huán)右移K位
問題描述
假設(shè)要把數(shù)組12345678右移2位,變?yōu)?8123456。
分析
方法一:
比較移位前后數(shù)組序列的形式,不難看出,其中有兩段序列的順序是不變的,即就是 78 和 123456, 可以把這兩段看做兩個整體,右移k位就是把數(shù)組的兩部分交換一下。時間復(fù)雜度為O(n)
步驟:
1)逆序數(shù)組子序列123456,數(shù)組序列的形式為65432178
2)逆序數(shù)組子序列78, 數(shù)組序列的形式變?yōu)?5432187
3)全部逆序, 數(shù)組序列的形式為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位后面的數(shù),數(shù)組的前K位依次向后移動k位,最后將集合中的后k位數(shù)放到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;
?? ?}以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言詳細(xì)分析講解關(guān)鍵字const與volatile的用法
在C語言中,我們經(jīng)常會見到const和volatile這兩個關(guān)鍵字,那么我們今天就來介紹下這兩個關(guān)鍵字,提起?const?關(guān)鍵字,我們可能首先想到的是經(jīng)過它修飾的變量便是常量了。其實我們這種想法是錯誤的,其實?const?修飾的變量是只讀的,其本質(zhì)還是變量2022-04-04
C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實現(xiàn)
這篇文章主要介紹了C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09
C++ EasyX學(xué)習(xí)之鼠標(biāo)操作詳解
EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。本文將為大家詳細(xì)講講EasyX的鼠標(biāo)操作,需要的可以參考一下2022-07-07
C語言實現(xiàn)學(xué)生信息管理系統(tǒng)開發(fā)
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)學(xué)生信息管理系統(tǒng)開發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08
詳解c++中signal信號攜帶數(shù)據(jù)的接收與發(fā)送
這篇文章主要為大家詳細(xì)介紹了c++中signal信號攜帶數(shù)據(jù)的接收與發(fā)送的相關(guān)知識,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01

