陣列元素迴圈右移

2022-03-10 23:52:42 字數 3310 閱讀 1101

/*1008. 陣列元素迴圈右移問題 (20)

時間限制

400 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

乙個陣列a中存有n(n>0)個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m(m>=0)個位置,即將a中的資料由(a0 a1……an-1)變換為(an-m …… an-1 a0 a1……an-m-1)(最後m個數迴圈移至最前面的m個位置)。如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?

輸入格式:每個輸入包含乙個測試用例,第1行輸入n ( 1<=n<=100)、m(m>=0);第2行輸入n個整數,之間用空格分隔。

輸出格式:在一行中輸出迴圈右移m位以後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。

輸入樣例:

6 2

1 2 3 4 5 6

輸出樣例:

5 6 1 2 3 4

要把num個元素移動

tran

個單位,

法1:

例子:1 2 3 4 5 6移動2個單位

最簡單的方法 :1 2 3 4 5 6-》6 1 2 3 4 5  -5 6 1 2 3 4

這個方法就是直接暴力地把乙個乙個的數字往後移動,但是這種演算法為o(n²)

c語言實現

#include

#include

int main(){

int num,tran;//num為元素個數,

tran

為移動的距離

int i,temp,j;

scanf("%d%d",&num,&tran);

int *p;

p=(int *)malloc(sizeof(int)*num);//動態分配記憶體

for(i=0;iscanf("%d",&p[i]);

for(i=0;itemp=p[num-1];

for(j=num-1;j>=1;j--)

p[j]=p[j-1];

p[0]=temp;

for(i=0;iprintf("%d",p[i]);

return 0;

法二:指標翻轉法

例子: 把 1 2 3 4 5 6  移動

2 個單位

第一步: 把前(

6-2)

=4個元素左右互換 從1 2 3 45 6得到[4 3 2 1]5 6

第二步:

把後 6-(

6-2)

=2個元素左右互換 從  4 3 2 15 6   得到4 3 2 1[6 5]

第三步:

把所有6個元素互換 得到[4 3 2 1 6 5]得到5 6 1 2 3 4證明:

num個元素

向右移動tran個單位

設元素 a   移動tran個單位後為a+tran

1.元素在前num-tran的時候

第一步:

得到的下標為(num-tran -i-1)

第三步:

得到的下標為num-(num-tran-i-1)-1

num-(num-tran-i-1)-1化簡後的到tran+i即得以證明

2:同理可證 後num-tran的時候

c語言實現

#include

int a[100];  

void reverse(int *a, int p, int q){  //p指向頭元素  

q指向尾元素

int i;

for ( i = p; i <= (p + q) / 2; i++){  

int tmp = a[i];  

a[i] = a[p + q- i];  

a[p + q- i] = tmp;  

int main(){  

int num,tran,i;  

scanf("%d%d", &num, &tran);  

tran %= num;  

for (i = 0; i < num; i++)  

scanf("%d", &a[i]);  

reverse(a, 0, num-tran-1);  //進行前半部分的交換

reverse(a, num-tran, num-1);  //進行後半部分的交換

reverse(a, 0, num-1);  //整體交換

for (i = 0; i < num; i++)  

printf("%d%s", a[i], (i-num+1?" ":"\n"));  

return 0;  

程式設計愛好者 248351598

-by 半臻

陣列元素迴圈右移問題

乙個陣列a中存有n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m 0 個位置,即將a中的資料由 a0a1 an 1 變換為 an man m 1 a0a1 an m 2an m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方法?輸...

陣列元素迴圈右移問題

written by bruth lee in southwest universiy of science and technology.乙個陣列 a中存有 n 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移 m 個位置,即將 a中的資料由 a 0 a 1 a n 1 變換為 a n ...

陣列元素迴圈右移問題

乙個陣列a中存有n 0 個整數,在不允許使用另外陣列的前提下,將每個整數迴圈向右移m 0 個位置,即將a中的資料由 a 0 a 1 a n 1 變換為 a n m a n 1 a 0 a 1 a n m 1 最後m個數迴圈移至最前面的m個位置 如果需要考慮程式移動資料的次數盡量少,要如何設計移動的方...