之前面试被要求现场写一个字符串的移动问题,由于很多问题没考虑到,写的十分不理想。偶然翻看《编程珠玑》上面的方法。整理一下。
- #include<stdio.h>
- #include <string.h>
- /*********************************************
- 方法1:三次交换即可
- reverse(0,i-1);
- reverse(i,n-1);
- reverse(0,n-1);
- *********************************************/
- void reverse(char * arry,int left,int right);
- void CharShiftN1(char *arry,int i)
- {
- int n=strlen(arry);
- if (i>=n)//需要考虑i>n的情况,容易忽略
- {
- i=i%n;
- }
- reverse(arry,0,i-1);
- // printf("%s\n",arry);
- reverse(arry,i,n-1);
- // printf("%s\n",arry);
- reverse(arry,0,n-1);
- // printf("%s\n",arry);
- }
- /*字符串逆置*/
- void reverse(char * arry,int left,int right)
- {
- char c;
- for(int i=left,j=right;i<j;i++,j--)
- {
- c=arry[i];
- arry[i]=arry[j];
- arry[j]=c;
- }
- }
- int main()
- {
- char a[]="abcdefgh";
- CharShiftN1(a,9);
- printf("Shift1:%s\n",a);
- return 0;
- }
用一个数学上的原理很容易理解这样思路,矩阵转置的问题,把字符串看成i*1和(n-i)*1的举证,即A看成i*1的矩阵,B为(n-i)*1的矩阵。
((A~)(B~))~=BA