在劍指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