面试题3:字符串的旋转
2016-03-21 20:38 Keiven_LY 阅读(334) 评论(0) 编辑 收藏 举报题目描述
给定一个字符串,要求将字符串前面的若干字符移到字符串的尾部。比如:将字符串“abcdef”的前3个字符’a’,’b’,’c’移到字符串的尾部,则原字符串将变为“defabc”。请写一个函数来实现此功能。
方法一:蛮力移位
基本思想:将需要移动的字符一个一个移动到字符串的尾部。
假设字符串s的长度为n,可以先实现一个函数移动字符串第1个字符到字符串的尾部,如果要移动前m个字符到字符串的尾部,可以调用m次上述函数即可。
void LeftShiftOne(char *s, int n) { char t = s[0]; //将字符串的第一个字符保存下来 //将字符串除第一个字符外的字符向前移动一位 for(int i=1;i<n;i++) s[i-1] = s[i]; s[n-1] = t; //将第一个字符放在字符串的最后一位 } void LeftShiftM(char *s, int n, int m) { while(m>0) { LeftShiftOne(s,n); m--; } }
方法二:三步反转
基本思想:
- 先将原字符串截成两部分X和Y,比如将“abcdef”截成X=“abc”,Y=“def”两部分;
- 再分别将X和Y的所有字符反转,即Xàcba,Yàfed;
- 最后将上述结果整体反转,即cbafedàdefabc。
void swapstring(char *s, int from, int to) { while(from < to) { char t = s[from]; s[from] = s[to]; s[to] = t; from++; to--; } } void LeftShiftM(char *s, int n, int m) { m %= n; //考虑移动大于n位时,则与%n是等价的 swapstring(s, 0, m-1); //X部分反转 swapstring(s, m, n-1); //Y部分反转 swapstring(s, 0, n-1); //整体反转 }