题目描述:
1008 数组元素循环右移问题 (20 分)
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
分析:
我用的链表的方法来移动这个数列。链表的移动是链表里常见的题。但我感觉我这段代码写到后面思路有一点乱······读者可以根据我的思路,优化这段代码,使代码更加简洁一点。
运行结果是正确的。
结果:
提交时间 | 状态 | 分数 | 题目 | 编译器 | 耗时 | 用户 |
---|---|---|---|---|---|---|
2019/1/16 20:32:49 | 答案正确 |
20 | 1008 | C++ (g++) | 3 ms | 方人也几点 |
代码:
#include<iostream>
#include<stdlib.h>
using namespace std;
struct node{
int data;
node* next;
};
int main(){
//初始化
int n,m,i;//n个元素,移动m个位置
cin>>n>>m;
m=m%n;//避免循环移动
node* nod[n];
node *head,*pre,*p;
head = new node;
head->next = NULL;
//输入
for(i=0;i<n;i++){
nod[i] = new node;
cin>>nod[i]->data;
}
//创建链表
head->next = nod[0];
for(i=1;i<n;i++){
nod[i-1] -> next = nod[i];
}
nod[n-1]->next = NULL;//最后一位置空
p = head -> next;
//移动
if(m!=0){
for(i=0;i<n-m;i++){
pre = p;
p = p->next;
}
pre->next = NULL;
pre = p;//pre等于要移动的数列头
while(p->next){
//pre = p;
p = p->next;//p等于要移动的数列尾
}
//下面将要移动的整个数列加入到head后
p->next = head->next;
head->next = pre;
//输出
p = head->next;
while(p != NULL){
cout<<(p->data)<<((p->next == NULL)?"":" ");
p = p->next;}
}
else{
p = head->next;
while(p != NULL){
cout<<(p->data)<<((p->next == NULL)?"":" ");
p = p->next;}
}
return 0;
}
附:
写代码的时候 cout<<(p->data)<<((p->next == NULL)?"":" "); 红色的括号忘记加了,导致输出错误的格式。