题意:给一个字符串S,要求循环左移m位。如123456循环左移2位,得到345612。
我们假设字符串S长度为n,循环左移m位。假设S的前m位为A,其余为B,!(AB)=!((!A)(!B))。!表示逆序
令A=12,B=3456
先将A逆序=21
再将B逆序=6543
最后将S逆序=345612
/*循环左移字符串,科大讯飞面试题最后一道题,没有见过,
笔试的时候水过,面试的时候算法告诉我,我没有当回事,鬼画桃符,
自己都觉得羞愧,我给学校丢脸了。*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#define N 100
void swap(char &a,char &b){a^=b;b^=a;a^=b;}
void InverseOrder(char *a,int l,int r)
{
while(l<r)
swap(a[l++],a[r--]);
}
int main()
{
char s[100];
int m;
scanf("%s %d",s,&m);
puts(s);
int n=strlen(s);
m%=n;
InverseOrder(s,0,m-1);//先将s前半部分全部逆序
InverseOrder(s,m,n-1);//再将s后半部分逆序
InverseOrder(s,0,n-1);//最后将s逆序
puts(s);
return 0;
}