字符串循环右移N位

给一个长度为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]);
        }
    }
}
View Code
原文地址:https://www.cnblogs.com/huhuuu/p/3452956.html