習題 實現乙個函式,可以左旋字串中的k個字元

2021-09-29 16:48:09 字數 1922 閱讀 9707

c語言

實現乙個函式,可以左旋字串中的k個字元。

例如:abcd左旋乙個字元得到bcda

abcd左旋兩個字元得到cdab

思路一:

常規思路很簡單,很容易想出來,以左旋乙個字元為例,建立乙個變數tmp將字串的第乙個字元賦給tmp,然後將字串所有的字元往前移一位比如移動之前是abcd,移動之後就是bcdd,因為最後乙個字元是沒有後乙個字元前移覆蓋它的,所以保持不變,然後再將tmp賦給最後乙個字元即完成乙個字元的左旋。若需要左旋n個字元就再套乙個迴圈,反覆完成左旋乙個字元的操作就行了。不過需要注意的是,假如字串的長度是len,如果需要左旋的字元數量大於字串長度了就會進行很多無用的操作,所以加上乙個語句n %= len(n是需要左旋的字元個數,len是字串長度)。

這個思路的時間複雜度是o(n^2),下面看**實現:

#include

#include

#include

#include

void

leftmove

(char str,

int n,

int sz)

str[sz-1]

= tmp;}}

intmain()

思路二:

將這個思路稍微優化一下,左旋n個字元就是將左旋乙個字元重複n遍,這樣做效率有點低,我們可以再建立乙個字元陣列temp用來存需要左旋的字元,再將原字串的所以字元往前移動2位,例如abcd,移動後就是cdcd,然後將temp裡的字元依次賦給原字串的最後2位即可,雖然迴圈數量更多了,但是這樣不用迴圈套迴圈,時間複雜度是o(n)

#include

#include

#include

#include

void

leftmove

(char arr,

int n,

int len)

for(i =

0; i < len - n; i++

)for

(i =

0; i < n; i++)}

intmain()

思路三:

這種思路很難一開始就想到,時間複雜度是o(n),相比上面的兩種思路會好很多。

**實現

#include

#include

#include

#include

void

reverse

(char

*start,

char

*end)

}void

leftmove

(char

*str,

int len,

int num)

intmain()

思路四:

上面的三種思路已經將時間複雜度逐漸優化到了o(n),但是還能繼續優化,理論上可以達到時間複雜度o(1)。思路如下:

**實現:

#include

#include

#include

#include

void

leftmove

(char

*str,

int len,

int num)

intmain()

四種思路中前兩種算是常規思路,容易想上去的,後兩種一時半會很難想到,我個人建議使用第三種思路,而且這種思路在別的題目依舊可以用到。

實現乙個函式,可以左旋字串中的k個字元

實現乙個函式,可以左旋字串中的k個字元 例如 aabcd左旋乙個字元得到abcda aabcd左旋兩個字元得到bcdaa 方法 1 採用迴圈移位,對需要旋轉的k個字元按順序進行旋轉,先將要旋轉的乙個字元儲存起來,將後面的往前挪動一位,再將儲存起來的這個字元賦給最後一位,這樣連續迴圈k次,就可以完成了...

實現乙個函式,可以左旋字串中的k個字元

實現乙個函式,可以左旋字串中的k個字元。aabcd左旋乙個字元得到abcda aabcd左旋兩個字元得到bcdaa 1 可以通過字串互換,每左旋一次,字串第乙個移到最後乙個,其餘字元整體向前移動一位。如下 include include includevoid reverse char str,in...

實現乙個函式,可以左旋字串中的k個字元

實現乙個函式,可以左旋字串中的k個字元。aabcd左旋乙個字元得到abcda aabcd左旋兩個字元得到bcdaa 在c語言中,實現字串旋轉的方法有很多,今天我給大家介紹較為常見的三種實現方法,他們的時間複雜度還是有較大的差別,空間的占用也不盡相同,所以大家在以後的使用中按要求來選擇實現的方法。方法...