程式員面試題精選(21):左旋轉字串

來源:互聯網
上載者:User

題目:定義字串的左旋轉操作:把字串前面的若干個字元移動到字串的尾部。如把字串abcdef左旋轉2位得到字串cdefab。請實現字串左旋轉的函數。要求時間對長度為n的字串操作的複雜度為O(n),輔助記憶體為O(1)。

分析:如果不考慮時間和空間複雜度的限制,最簡單的方法莫過於把這道題看成是把字串分成前後兩部分,通過旋轉操作把這兩個部分交換位置。於是我們可以新開闢一塊長度為n+1的輔助空間,把原字串後半部分拷貝到新空間的前半部分,在把原字串的前半部分拷貝到新空間的後半部分。不難看出,這種思路的時間複雜度是O(n),需要的輔助空間也是O(n)。

接下來的一種思路可能要稍微麻煩一點。我們假設把字串左旋轉m位。於是我們先把第0個字元儲存起來,把第m個字元放到第0個的位置,在把第2m個字元放到第m個的位置…依次類推,一直移動到最後一個可以移動字元,最後在把原來的第0個字元放到剛才移動的位置上。接著把第1個字元儲存起來,把第m+1個元素移動到第1個位置…重複前面處理第0個字元的步驟,直到處理完前面的m個字元。

該思路還是比較容易理解,但當字串的長度n不是m的整數倍的時候,寫程式會有些麻煩,感興趣的朋友可以自己試一下。由於下面還要介紹更好的方法,這種思路的代碼我就不提供了。

我們還是把字串看成有兩段組成的,記位XY。左旋轉相當於要把字串XY變成YX。我們先在字串上定義一種翻轉的操作,就是翻轉字串中字元的先後順序。把X翻轉後記為XT。顯然有(XT)T=X。

我們首先對X和Y兩段分別進行翻轉操作,這樣就能得到XTYT。接著再對XTYT進行翻轉操作,得到(XTYT)T=(YT)T(XT)T=YX。正好是我們期待的結果。

分析到這裡我們再回到原來的題目。我們要做的僅僅是把字串分成兩段,第一段為前面m個字元,其餘的字元分到第二段。再定義一個翻轉字串的函數,按照前面的步驟翻轉三次就行了。時間複雜度和空間複雜度都合乎要求。

參考代碼如下:

#include "string.h"

///////////////////////////////////////////////////////////////////////
// Move the first n chars in a string to its end
///////////////////////////////////////////////////////////////////////
char* LeftRotateString(char* pStr, unsigned int n)
{
      if(pStr != NULL)
      {
            int nLength = static_cast<int>(strlen(pStr));
            if(nLength > 0 || n == 0 || n > nLength)
            {
                  char* pFirstStart = pStr;
                  char* pFirstEnd = pStr + n - 1;
                  char* pSecondStart = pStr + n;
                  char* pSecondEnd = pStr + nLength - 1;

                  // reverse the first part of the string
                  ReverseString(pFirstStart, pFirstEnd);
                  // reverse the second part of the strint
                  ReverseString(pSecondStart, pSecondEnd);
                  // reverse the whole string
                  ReverseString(pFirstStart, pSecondEnd);
            }
      }

      return pStr;
}

///////////////////////////////////////////////////////////////////////
// Reverse the string between pStart and pEnd
///////////////////////////////////////////////////////////////////////
void ReverseString(char* pStart, char* pEnd)
{
      if(pStart == NULL || pEnd == NULL)
      {
            while(pStart <= pEnd)
            {
                  char temp = *pStart;
                  *pStart = *pEnd;
                  *pEnd = temp;

                  pStart ++;
                  pEnd --;
            }
      }
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.