在剑指offer里有左移的题目,牛客网上也有右移的题目。简单的总结一下。
方法一:
假如使用string的话比较方便。
string LeftRotateString(string str, int n) { if(n<=0||str.size()==0) return str; int len=str.size(); n=n%len; str+=str; return str.substr(n,len); }
这里使用的是将两个string拼接在一起。然后再从拼接好的部分中去出。这里使用的substr函数。假如是左移的话就从下标为移位的n出开始计算。假如是右移那么就从字符串长度len-n作为瞎掰哦的地方开始取。
方法二:
利用三次翻转
class Solution { public: void fun(string &s, int start, int end) { char temp; while (start < end) { temp = s[start]; s[start] = s[end]; s[end] = temp; start++; end--; } } string LeftRotateString(string str, int n) { int len = str.length(); if (0 == len || 0 == n) return str; string &temp = str; fun(temp, 0, n - 1); fun(temp, n, len - 1); fun(temp, 0, len - 1); return str; } };
这里用了三次翻转。将各自部分分别翻转,然后再总的进行一次翻转。
方法3:
使用memcpy
void LoopMove(char *str, int steps) { int len = strlen(str); char tmp[MAXSIZE]; memcpy(tmp, str+len-steps, steps); memcpy(tmp+steps, str, len-steps); memcpy(str, tmp, steps); }
新创建一个临时的变量。然后将循环移动后的部分赋值进去,在复制后面的部分,最后复制回原来的部分。这里一定要注意,假如传入的指针是指向常量的话就不能进行最后一步将临时指针的内容复制到原指针的这一步。
方法四:
使用strcpy函数
void LoopMove(char *str, int steps) { int len = strlen(str); char tmp[MAXSIZE]; strcpy(tmp, str+len-steps); strcpy(tmp+steps, str); *(tmp+len) = '\0'; strcpy(str, tmp); }这里注意,在结束的时候一定要对字符串最后一位进行加\0的处理。虽然strcpy会复制\0,但是由于strcpy复制是将后面的指针指向的字符串整个的复制到目的字符串后面,也就是说复制第二个指针的字符串直到遇到\0。所以在复制完指定的字符串后就一定要手动的加上结束\0