閱讀473 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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

  上一篇:go 【轉】ubuntu修改主機名
  下一篇:go Jlink 燒寫Uboot