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語言中,實現字串旋轉的方法有很多,今天我給大家介紹較為常見的三種實現方法,他們的時間複雜度還是有較大的差別,空間的占用也不盡相同,所以大家在以後的使用中按要求來選擇實現的方法。方法...