1008 数组元素循环右移问题 (20 分)
题目链接
算法分析
方法一:链表建立起来,链表头的改变即为数组的循环移位
方法二:用temp存下数组的最后一个数,然后前面的数整体后移,再把tmep赋给第一个数
代码实现1
#include<bits/stdc++.h>
using namespace std;
struct ss{
int value;
ss *next;
};
ss *head, *p, *r;
int main(){
int n, m, x;
scanf("%d%d", &n, &m);
head = new ss;
r = head;
for(int i = 1; i <= n; ++ i){
scanf("%d", &x);
p = new ss;
p->value = x;
p->next = NULL;
r->next = p;
r = p;
}
int t = 0;
int begin = m % n;
if(begin == 0) begin = 1;
else begin = n + 1 - begin;
p -> next = head -> next;
p = new ss;
p = head -> next;
while(1){
t ++;
if(t >= begin){
cout<< p->value;
if(t - begin + 1 < n) cout<< ' ';
else break;
}
p = p->next;
}
return 0;
}
代码实现2
#include <stdio.h>
#define MAXN 105
void 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;
}
void ArrayShift( int a[], int n, int m ){
while(m --){
int temp = a[n - 1];
for(int i = n - 1; i >= 0; -- i)
a[i + 1] = a[i];
a[0] = temp;
}
return ;
}