题目描述
对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。
给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。
测试样例:
"ABCDEFGH",8,4
返回:"FGHABCDE"
问题简化:假设现在只要把E放在左边,那么我们可以先用一个变量记录E,然后把整个字符串向右移动一位,第一个空出来的位置用变量填充,即达到效果。
那么现在的问题,就是把p到n-1的字符放在串首,还是和上面一样道理,只是加一个外循环,看需要向右移动几次。代码如下:
class StringRotation { public: string rotateString(string A, int n, int p) { // write code here char ch; for(int i=0;i<n-p-1;i++) { ch=A[n-1]; for(int j=n-1;j>=1;j--) { A[j]=A[j-1]; } A[0]=ch; } return A; } };
思路:题目的意思是把后部分的字符串都转移到原字符串的串首。那么首先需要计算有多少个字符需要转移。用一个外循环,n-1-p即为后部分的字符数(所需要转移字符);另外设一个字符ch用来记录最后一个字符,然后开始用一个内循环,每次删除最后一个字母,直到删除到0处,把ch记录的字符放在下标为0处;
通过查阅资料,发现一些简单方法.
第一次两部分分别reverse 。
第二次整体reverse。
string rotateString(string A, int n, int p) { // write code here //剑指offer上的题目,两次翻转 //先进行局部翻转 int i = 0, j = p; while(i < j) swap(A[i++], A[j--]); i = p + 1, j = n - 1; while(i < j) swap(A[i++], A[j--]); //再整体翻转 i= 0, j = n - 1; while(i < j) swap(A[i++], A[j--]); return A; } // 如果调用reverse函数,看起来更简单。。。 string rotateString(string A, int n, int p) { // write code here //剑指offer上的题目,两次翻转 //先进行局部翻转 reverse(A.begin(), A.begin()+p+1); //vector的迭代器支持 + reverse(A.begin()+p+1, A.end()); //再整体翻转 reverse(A.begin(), A.end()); return A; }
拼接两个字符串,从中间截取源字符串长度,就得到了旋转字符串
classStringRotation { public: string rotateString(string A, intn, intp) { // write code here return(A+A).substr(p+1,n); } };
拥抱明天!
不给自己做枷锁去限制自己。
别让时代的悲哀,成为你人生的悲哀。