劍指Offer之左旋轉字符串(Move!Move!!Move!!!)
- 題目描述:
- 匯編語言中有一種移位指令叫做循環左移(ROL),現在有個簡單的任務,就是用字符串模擬這個指令的運算結果。對於一個給定的字符序列S,請你把其循環左移K位後的序列輸出。例如,字符序列S=”abcXYZdef”,要求輸出循環左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!
- 輸入:
- 多組測試數據,每個測試數據包含一個字符序列S和非負整數K。其中S的長度不超過1000。
- 輸出:
- 對應每個測試案例,輸出新序列。
- 樣例輸入:
-
UDBOJ 4 abba 1
- 樣例輸出:
-
JUDBO bbaa
思路源於前一篇文章思路:反轉單詞順序
【代碼】
/********************************* * 日期:2013-12-02 * 作者:SJF0115 * 題號: 題目1362:左旋轉字符串(Move!Move!!Move!!!) * 來源:https://ac.jobdu.com/problem.php?pid=1362 * 結果:AC * 來源:劍指Offer * 總結: **********************************/ #include <stdio.h> #include <malloc.h> #include <string.h> char *str; //反轉單詞 void ReverseWord(char* words,int begin,int end){ int temp; if(words == NULL || begin > end || begin < 0){ return; } //反轉 while(begin < end){ temp = words[begin]; words[begin] = words[end]; words[end] = temp; begin ++; end --; } } char* Reverse(char* str,int n){ if(str == NULL || n < 0){ return ""; } int len = strlen(str); //分成兩部分(1)前n項(2)剩餘項 //反轉前n個 ReverseWord(str,0,n-1); //反轉剩餘 ReverseWord(str,n,len-1); //全部反轉 ReverseWord(str,0,len-1); return str; } int main() { int i,n; str = (char*)malloc(sizeof(char)*1001); while(scanf("%s",str) != EOF){ scanf("%d",&n); //左旋轉 //注意一下n需要取餘就可以了,不能超過字符串自身的長度 n = n % strlen(str); str = Reverse(str,n); //輸出 for(i = 0;i < strlen(str);i++){ printf("%c",str[i]); } printf("\n"); }//while return 0; }
最後更新:2017-04-03 14:54:27