編程珠璣之左旋轉一個字符串

描述

將一個n元一維向量向左旋轉i個位置。例如,n=8,i=3,向量abcdefgh旋轉結果爲defghabc. 要求是使用數十個額外字節的存儲空間,在正比於n的時間內完成向量的旋轉??

思路

簡答的代碼就是存儲前i個,然後將後面n-i依次向前挪動。這樣的使用的i個額外空間就是過大的存儲空間的消耗。另外一個方法就是遞歸調用,每次旋轉一個,然後調用i次。還一個方法就是按照第i個劃分,分別將兩部分翻轉,然後再將整個向量翻轉。這樣的複雜度是O(n).下面是書上講解的方法的實現,各位可以感受一下:

string reverIth(string& src,int i){
    int n = src.size();
    if(i>=n)
        return src;
    char temp;
    for(int j=0;j<i;++j){
        temp=src[j];
        int m=j;
        while(m<n-i){
            src[m]=src[m+i];
            m = m+i;
        }
        src[n-i+j]=temp;
    }
    return src;
 }

//交換
string reverIth2(string& src,int i){
    // cout<<src;
    int n = src.size();
    int m=0,k=i;
    while(m<=(i-1)/2){
        int temp = src[m];
        src[m]=src[i-1-m];
        src[i-1-m]=temp;
        ++m;
    }
    //cout<<src;
    while(k<=(n+i-1)/2){
         int temp = src[k];
        src[k]=src[n+i-1-k];
        src[n+i-1-k]=temp;
        ++k;
    }
    k=0;
    while(k<=(n-1)/2){
         int temp = src[k];
        src[k]=src[n-1-k];
        src[n-1-k]=temp;
        ++k;
    }
    return src;
 }
發佈了77 篇原創文章 · 獲贊 23 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章