給定乙個字串,將後m個字元移到整個字元的前面

2021-10-23 17:01:11 字數 1224 閱讀 5067

9.寫**環節

問題:給定乙個字串,將後m個字元移到整個字元的前面。例 str = "abcd12"  m=2,輸出 「12abcd」

①.先寫了乙個最低階的雙重for迴圈把最後m個字元依次和前面交換換到最前。時間複雜度o(mn)。面試官說需要優化一下

②.繼續寫了乙個臨時變數存後m個字元,然後把全部前面的字元從後往前直接覆蓋到字串尾部。時間複雜度o(n),空間複雜度o(m)。面試官說時間複雜度可以但是空間複雜度還不好

③.最後說思路,在m已知的情況下,每個字元的位置是已知的,就比如前面的字元,index為x那麼新的字串中它的index會變為x+m,這樣就可以直接把每個字元都放到它們最終的位置,只需要固定的額外記憶體來存乙個字元的備份以及其他變數。

此時時間複雜度o(n),空間複雜度o(1)。

(補充)關於上述兩種情況何時出現:

其實是這樣的,對於乙個長度為 nn 的陣列,整體移動 kk 個位置

當 nn 和 kk 的最大公約數 等於 1 的時候:1 次遍歷就可以完成交換;比如 n = 5, k = 3n=5,k=3

當 nn 和 kk 的最大公約數 不等於 1 的時候:1 次遍歷是無法完成的所有元素歸位,需要 mm (最大公約數) 次

所以在最大公約數不為 1 的時候

比如 [a,b,c,d,e,f][a,b,c,d,e,f] 此時 n = 6 \ , k = 4n=6 ,k=4 ,其最大公約數為 22 ,因此需要 22 輪迴圈

我們就可以把這個陣列分成兩部分來看:

第 11 輪迴圈(分組1): a \ e \ c \ [a]a e c [a]

第 22 輪迴圈(分組2): \ \ \ \ b \ f \ d \ [b]    b f d [b]

即:每一輪迴圈只會在自己的那一組上不停的遍歷。所以

陣列的前 mm 個元素,其實就是每乙個分組的第乙個元素,我們控制流程在每次發現一輪迴圈走到原點時+1

那麼如何判斷所有的分組都執行歸位了呢? 可以有兩種方法來控制

第一種:我們就用最大公約數 mm 來控制外迴圈,代表總共有 mm 輪迴圈

第二種:由於nn個元素歸位需要nn次交換,所以我們定義乙個count代表交換次數,當 count = n 時完成

將乙個字串逆序

這個題要我自己寫還不太有思路,可能不會想到寫三個函式,而且這個 也沒有執行出來 include include include pragma warning disable 4996 有乙個字元陣列的內容為 student a am i 請你將陣列的內容改為 i am a student 要求 不能...

程式設計題 給定乙個字串陣列,判斷每個字元出現次數

題目要求 給定乙個字串陣列,判斷每個字元出現多少次?解決思路 利用map的特性 即map集合中如果兩個key 鍵 值是一樣相同的,那麼,後放 put 入的值會將前面存在的value 值 替換掉,也就是覆蓋了前面的value。所以把字元陣列中的字元當作key,每遇到相同的key,value值加1即可。...

在乙個字串中尋找另外乙個字串

在乙個字串中尋找另外乙個字串 public class text foundit true break test system.out.println foundit?found it didn t find it 該段程式有點難以理解,主要就是if語句的理解,if searchme.charat ...