给一个长度为n的字符串,把这个字符串循环右移N位(0<N<n),要求只用O(1)的额外空间和O(N)时间,有些什么方法
一开始想到的是先保存temp=s[0],在左起第N个移到s[0]的位置,依次,但是会有问题
10
1 2 3 4 5 6 7 8 9 10
2
会成一个环路0 2 4 6 8
后来查了一下,有个叫做三次逆转的方法
X1部分为开始的K位字符,X2为剩下的N-K位,
先将X1逆转,在将X2逆转,在整个数组逆转
#include<stdio.h> #include<iostream> using namespace std; int s[109]; int main(){ int n,k; while(scanf("%d",&n)!=EOF){ int i; for(i=0;i<n;i++){ scanf("%d",&s[i]); } scanf("%d",&k); k=k%n; int end1=(k-1)/2; int end2=(k+n-1)/2; int end3=(n-1)/2; for(i=0;i<=end1;i++){ swap(s[i],s[k-1-i]); } for(i=k;i<=end2;i++){ swap(s[i],s[n-1+k-i]); } for(i=0;i<=end3;i++){ swap(s[i],s[n-1-i]); } for(i=0;i<n;i++){ printf("%d ",s[i]); } } }