473
技術社區[雲棲]
劍指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