左旋字串的三種實現

2021-07-13 08:32:56 字數 1966 閱讀 7632

左旋字串是許多公司面試官喜歡問到的問題,那麼這片博文就是要講一下左旋字串的實現以及《劍指offer》裡面是怎樣解決這個問題。

一.先看看一道面試題

eg:輸入乙個英語句子,翻轉句子中單詞的順序,但單詞內字元額順序不變。為了簡單起見,標點符號和普通字母一樣處理。例如輸入字串「i am a student.」,則輸出「student. a am i」。

或許許多同學都見過這道題,應該怎麼實現這個功能呢?

1.

1).首先翻轉整個字串。產生的結果就是「.tneduts a ma i」。

2).翻轉每乙個單詞。產生結果為「student. a am i」。

2.思路理清楚了,怎麼寫**呢?

1).首先實現乙個字串翻轉函式。

實現**:

void reverse(char *left, char *right)

}

2).接下來就要實現單詞內字元的翻轉。這時就要考慮傳入的是乙個單詞的條件。不難發現空格可以作為很好的判斷條件。難麼我們再來實現一下。

void reverse_arr(char *arr, int len)

reverse(pcur, arr - 1);

if (*arr == ' ')

}}

這個函式就這樣實現了。那麼,和我們今天要說的左旋字串有什麼關係呢?不妨讓我們在思考左旋字串的實現。

二.左旋字串的實現

1.有了上面的問題作為鋪墊,應該並不難想到左旋字串的實現也可以依葫蘆畫瓢。

2.給乙個左旋字串的題目吧,這樣比較利於我們思考。

eg:字就自己符串的左旋操作是把字串前面的若干個字元轉移到字串的尾部。比如,輸入字串「abcdefg」和數字2,該函式將返回左旋轉2位i得到的結果「cdefgab」。

1).這道題目的字串運算元是2,那麼我們是不是可以考慮將前兩位字串翻轉,既ab翻轉得到ba? 然後將字串後面的字元,再進行翻轉,既cdefg得到gfedc。那麼我們的字串變成了「bagfedc」,然後將整個字串反轉是不是就可以得到我們想要的左旋字串?讓我們一起來實現一下吧。

2).同理需要乙個實現字串翻轉的函式。和上面的**一樣,我就不再重複。

3).那麼剩下來就是呼叫字串翻轉函式的問題,說直白一點就是傳參的問題。看看我的實現**。

void left_move(char *arr, int len, int k)

*(str+j) = tmp; }}

int main()

#include#includevoid left_move(char *det, char *src, int k)

for (j = 0,i=k; i < len; i++)

det[len] = '\0';

}int main()

以上就是本人在學習過程中的一些經驗總結。當然,本人能力有限,難免會有紕漏,希望大家可以指正。

本文出自 「做乙個小小小司機」 部落格,請務必保留此出處

左旋字串的三種演算法

abcd1234 左旋4個字元 1234abcd 方法一 迴圈移動 這裡先把 a 右移7個單位,得到bcd1234a,然後再把 b 右移7個單位 得到cd1234ab。按這個步驟迴圈四次後得到1234abcd。如下 void left rotate char str,int len,int k st...

左旋字串的三種方法

注 有效次數為 總次數 n 如上圖所示,假設對字串左旋6次和左旋2次,得到的結果是一樣的 思路 include include include include pragma warning disable 4996 遮蔽scanf出現的錯誤 char a abcd1234 變數定義成全域性較好 in...

左旋字串,三種方式任你挑選哦

左旋字串中的k個字元 abcd左旋乙個字元得到bcda abcd左旋兩個字元得到cdab。以此類推。是不是剛拿到手有一種我去,好簡單 但寫 時是 我去,這咋弄 新手的我是這樣哈哈 第一種 乙個乙個來 就是字面的意思 左旋一次,如圖 左旋幾次,就重複幾次這樣的 第二種 一塊一塊來還是字面的意思,左旋的...