循环左移
思路:长度为n,移动m位,相当于移动m%n次
1.前m%n位反转
2.后n - m%n位反转
3.整体反转
例如: abcde
移动两位: cdeab
循环右移则第三步整体反转先执行,再执行第一二步
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[110];
void rev(int h, int t){
while(h < t){
swap(str[h],str[t]);
h++;t--;
}
}
int main(){
int m;
scanf("%s%d",str,&m);
int n = strlen(str);
m=m%n;
rev(0,m-1);//反转前m位
rev(m,n-1);//反转剩下的n-m位
rev(0,n-1);//整体反转
puts(str);
return 0;
}
循环右移
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int arr[110];
void rev(int h, int t){
while(h < t){
swap(arr[h],arr[t]);
h++;t--;
}
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",arr+i);
}
m=m%n;
rev(0,n-1);//整体反转
rev(0,m-1);//反转前m位
rev(m,n-1);//反转剩下的n-m位
for(int i=0;i<n;i++){
printf(i==0?"%d":" %d",arr[i]);
}
putchar(10);
return 0;
}