1008 数组元素循环右移问题 (20 分)
一个数组AAA中存有NNN(>0>0>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移MMM(≥0\ge 0≥0)个位置,即将AAA中的数据由(A0A1⋯AN−1A_0 A_1 \cdots A_{N-1}A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1A_{N-M} \cdots A_{N-1} A_0 A_1 \cdots A_{N-M-1}AN−M⋯AN−1A0A1⋯AN−M−1)(最后MMM个数循环移至最前面的MMM个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入NNN(1≤N≤1001\le N \le 1001≤N≤100)和MMM(≥0\ge 0≥0);第2行输入NNN个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移MMM位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
思路:
(version 1.0)
这道题的重点是,除了接收数据的数组以外,不让用另外的数组。
题意大概是,例如
① N(6) M(2)
arr[6] = 123456
ans = 561234
② N(8) M(3)
arr[8] = 12345678
ans = 67812345
所以不让用数组,我的思路就是用串
(2.0)
不需要用串,只需要控制打印顺序即可
先打印56,再打印1234
补救:
① 字符串与字符数组之间的转换
https://blog.csdn.net/xinwang24/article/details/6612686
② 字符串的正确赋值方式
https://zhidao.baidu.com/question/495385604110424684.html
② 字符串的动态赋值
https://zhidao.baidu.com/question/60668767.html?fr=iks&word=getchar&ie=gbk
尝试AC
(一)
using namespace std;
#include<iostream>
#include<string>
int main(){
int N(0),M(0);
char array[100]={0};
cin>>N>>M;
cin>>array[100];
//str(&a[0],&a[strlen(a)])
string str1(&array[N-M],&array[M]);
string str2(&array[0],&array[N-M+1]);
cout<<str1<<str2<<endl;
// cout<<array;
return 0;
}
字符串赋值错误,说是弄了个空串
(二)
我发现我想得复杂了…
明明可以直接用一个int数组解决的
using namespace std;
#include<iostream>
#include<string>
#include<conio.h>
int main(){
int N(0),M(0);
int array[100];
int i(0);
cin>>N>>M;
for(i=0;i<N; i++){
cin>>array[i];
}
//str(&a[0],&a[strlen(a)])
// string str1(&array[N-M],&array[M]);
// string str2(&array[0],&array[N-M+1]);
// cout<<str1<<str2<<endl;
for(i=N-M; i<N; i++){
cout<<array[i]<<' ';
}
for(i=0; i<N-M; i++){
cout<<array[i]<<' ';
}
cout<<endl;
return 0;
}
但是最后一个space control…我好想有点转不过弯来
(三)
解决了space control 的问题
using namespace std;
#include<iostream>
#include<string>
//#include<conio.h>
int main(){
int N(0),M(0);
int array[100];
int i(0);
cin>>N>>M;
for(i=0;i<N; i++){
cin>>array[i];
}
//str(&a[0],&a[strlen(a)])
// string str1(&array[N-M],&array[M]);
// string str2(&array[0],&array[N-M+1]);
// cout<<str1<<str2<<endl;
for(i=N-M; i<N; i++){
cout<<array[i]<<' ';
}
for(i=0; i<N-M-1; i++){
cout<<array[i]<<' ';
}
if(i=N-M-1)
cout<<array[i]<<endl;
// cout<<endl;
return 0;
}
结果说是部分正确,只过了一个测试点
score 10 =-=
(四)
把 line 25的判断语句改了一下
变成 '=='
又过了两个测试点
using namespace std;
#include<iostream>
#include<string>
//#include<conio.h>
int main(){
int N(0),M(0);
int array[100];
int i(0);
cin>>N>>M;
for(i=0;i<N; i++){
cin>>array[i];
}
//str(&a[0],&a[strlen(a)])
// string str1(&array[N-M],&array[M]);
// string str2(&array[0],&array[N-M+1]);
// cout<<str1<<str2<<endl;
for(i=N-M; i<N; i++){
cout<<array[i]<<' ';
}
for(i=0; i<N-M-1; i++){
cout<<array[i]<<' ';
}
if(i==N-M-1)
cout<<array[i]<<endl;
// cout<<endl;
return 0;
}
所以还有6分在哪里呢…
(五)
没找出问题,看了一下大家的想法
发现需要保证 M<N
加了 line 13,顺利AC
巴适。
using namespace std;
#include<iostream>
#include<string>
//#include<conio.h>
int main() {
int N(0), M(0);
int array[100];
int i(0);
cin>>N>>M;
// ※ assure M<N
M = M%N;
for(i=0; i<N; i++) {
cin>>array[i];
}
//str(&a[0],&a[strlen(a)])
// string str1(&array[N-M],&array[M]);
// string str2(&array[0],&array[N-M+1]);
// cout<<str1<<str2<<endl;
for(i=N-M; i<N; i++) {
cout<<array[i]<<' ';
}
for(i=0; i<N-M-1; i++) {
cout<<array[i]<<' ';
}
if(i==N-M-1)
cout<<array[i]<<endl;
// cout<<endl;
return 0;
}
总结:
这道题没啥好总结的
但是对我这种菜鸟来说
最快的学习方法就是找资料,而不是自己闷着头想
这一点我跟szx不一样
她有哪里不明白就一直自己钻研
我不行,本来脑袋里空无一物
怎么想都想不通的
所以有思路卡断、空白的时候,就去看看大家的思路是什么样的
然后理解吸收之后,才会有我自己的想法
因为存货太少了=-= 还是要多学习啊哈哈
一礼拜下来,比第一天刷题的时候感觉好多了
至少有了想法,而不是无所适从、一片空白
干巴爹!