字串 迴圈移位問題

2021-06-18 18:50:14 字數 788 閱讀 9957

字串迴圈移位問題是面試中比較容易遇到的,就是輸入乙個字串和乙個整數,原地輸出移位後的字串。

不同的考官可能對程式的具體要求不同,這裡要求空間複雜度為o(1)。

這裡給出兩種解答方法。

(1)將移動n位看做「每次移動一位,共操作n次」,這是一種化整為零的思維方法。只要能想到這一步,相信下面的**就不難寫出了:

1

void shift_1(char*str)211

void shift_n(char* str, int

n)12

很顯然這個演算法的時間複雜度為o(nl), 空間複雜度為o(1)。其中l為字串長度。

(2)觀察移位後的字串和原串的差別,字串移n位相當於把前n位挪到了後面,而把後n位移到前面。

設字串長為l,把字串分成2個部分,前(l-n)個字元看做子串a,後n個字元看做子串b,則字串可用ab表示。完成移位操作後新串為ba。

那麼移位的過程就可以看做ab到ba的過程。

用a'表示a的反序串,b'表示b的反序串,那麼 ba = b''a'' =(a'b')'。 **如下:

1

//將乙個字串中某個子串反序

2void reverseorder(char* str, int p, intq)3

13}14void shift_n(char* str, int

n)15

演算法的空間複雜度為o(1)。把賦值操作作為考量時間複雜度的基本單位,3次呼叫reverseorder函式總共執行賦值操作3l,則演算法的時間複雜度為o(l)。

字串迴圈移位

把字串移動n位。可以乙個乙個移動,這樣的話,要移動n次,每次移動len個。演算法時間複雜度為o n len 也可以開闢乙個新的記憶體,把移動的最終位置計算出來,直接放到那裡即可,這樣時間負責度為o 1 空間複雜度為o len 除此之外,還有時間負責度為o 1 空間負責度也為o 1 的演算法。第一種方...

字串迴圈移位

首先,先看看如何對數字進行迴圈移位 c語言中沒有提供迴圈移位的操作符,但可以通過簡潔的方式實現迴圈移位,主要使用移位操作來實現。設乙個運算元x有s位則迴圈左移n位的操作為 x n x s n 同理右移n位位 x n x s n 實際程式設計中可以用巨集定義實現迴圈移位 define rotate l...

字串迴圈移位

問題描述 給定乙個字串,把字串前k個字元移動到尾部。例 字串 abcdefg 左移3為變成 defgabc 解決思路 引入矩陣中 a b ba的思想 a 為a的轉置矩陣 比如 abc cba,defg gfed,cbagfed defgabc。這樣的演算法時間複雜度是o n 空間複雜度是o 1 如下...