微軟,Google面試題 (21) —— 左旋字符串(循環移位)

題目:定義字符串的左旋轉操作:把字符串前面的若干個字符移動到字符串的尾部。如把字符串abcdef左旋轉2位得到字符串cdefab。請實現字符串左旋轉的函數。要求時間對長度爲n的字符串操作的複雜度爲O(n),輔助內存爲O(1)
解法一:不考慮時間和空間的限制。設移動的位數爲k。則循環k次,每次移動1位。這樣的空間複雜度是O(1),時間複雜度是O(n*k)。如果k小於n,則O(n^2)。
解法二:最直接的方法。開闢一塊大小爲n的內存,將前k個字符拷貝到後k個位置。將後面的n-k個字符拷貝到新空間前n-k個位置。這種方法時間複雜度爲O(n),空間複雜度爲O(n)。
解法三:反轉前k個字符,然後反轉後n-k個字符,最後反轉整個字符串。時間複雜度爲O(n),空間複雜度爲O(1)。
解法四:參考《STL源碼剖析》中算法一章的rotate()方法。假如字符串爲abcdefgh,需要左移3位。令first指向第一個元素a,令i = middle指向第k+1個元素d(迭代器的前開後閉原則)。
第一步:defabcgh (abc先結束,下一步目的是abc和def後面的元素gh整體交換)
第二步:defghcab (gh先結束, 下一步目的是c和原gh後的字符(結束符)進行交換,即可看成c與ab進行交換)

第三步:defghacb (c先結束,  下一步目的是c和a後面的元素b交換)

第四步:defghabc (結束)
這種方法的時間複雜度爲O(n),空間複雜度爲O(1)。

發佈了103 篇原創文章 · 獲贊 3 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章