題目:輸入一個字符串,將其進行右旋,如輸入“abcdef”,右旋二個將得到"efabcd",此題有多種解法,這裏介紹兩種常用的
字符右旋實現:(1)三步反轉法;(2)直接移動法
(1)三步反轉法:1)"abcd"->"dcba";
2)"ef"->"fe"; 此時得到"dcbafe"
3)"dcbafe"->"efabcd";
(2)直接移動法:建立一個臨時變量存放最後一個字符,然後將剩餘所有的字符向後移動,最後將臨時變量中存放的字符放入空出來的打一個位置中,如此循環n次;
(1)三步反轉法 # include <stdio.h> # include <string.h> # include <assert.h> void Reverse(char* start, char* end) { assert(start); assert(end); while (start < end) { char tmp = *start; *start = *end; *end = tmp; start++; end--; } } void RightLoopMove(char* pStr, size_t n) { int len = strlen(pStr); Reverse(pStr, pStr + len - n - 1); Reverse(pStr+len-n, pStr + len - 1); Reverse(pStr, pStr + len- 1); } int main() { char arr[] = "abcdef"; RightLoopMove(arr, 2); printf("%s\n", arr); system("pause"); return 0; } (2)直接移動法 # include <stdio.h> # include <string.h> # include <assert.h> RightLoopMove(char* pStr, size_t n) { assert(pStr); int len = strlen(pStr); while (n) { char tmp = pStr[len-1]; for (int i = len-1; i >0; i--) { pStr[i] = pStr[i - 1]; } pStr[0] = tmp; n--; } } int main() { char arr[] = "abcdef"; RightLoopMove(arr, 2); printf("%s\n", arr); system("pause"); return 0; }