面試題之O n 內旋轉字串

2021-09-11 22:46:20 字數 1041 閱讀 7390

樣例:

字串「abcd1234"左移3位結果為」234abcd1「

k:左移位數 

l:字串長度

方案1:暴力 o(k * l)

可以每次將陣列中的元素左移一位,迴圈k次。

abcd1234  ->4abcd123 ->34abcd12->234abcd1

演算法複雜度為o(k * l)

方案2:暴力+公式變形 o(n^2)

大家開始可能會有這樣的潛在假設,kl,左移k-l之後的陣列序列跟左移k位的結果是一樣的,進而可得出一條通用的規律:

左移k位之後的情形,跟左移k= k % n位之後的情形一樣

方案三:巧妙三次翻轉 0(n)演算法:

三次翻轉操作:

第一次:  adcd1變成1dcba

第二次:  234變成432

兩此翻轉之後結果是:1dcba432

第三次:  然後將得到的結果整體再翻轉一次:234abcd1

注意:如果左移位數k大於字串長度l,那麼左移k位和左移k%l結果是一樣的

code:

#include using

namespace

std;

void f(char str,int x,inty)}

intmain()

;

int k=3;//左

移3位 即234abcd1

int l=8

;

if(k>l)

k=k%l;//

如果k>l 那麼左移k位和左移k%l位結果是一樣的

f(str,

0,l-k-1

); cout

f(str,l-k,l-1

); cout

f(str,

0,l-1

); cout

return0;

}

posted @

2019-03-04 12:40

y先森0.0 閱讀(

...)

編輯收藏

面試題 旋轉字串

題目 定義字串的左旋轉操作 把字串前面的若干個字元移動到字串的尾部。如把字串abcdef左旋轉2位得到字串cdefab。請實現字串左旋轉的函式。要求時間對長度為n的字串操作的複雜度為o n 輔助記憶體為o 1 思路 將字串看做ab兩部分,將a反轉,再將b反轉,最後將反轉後的a 反轉後的b一起反轉就o...

面試題42 左旋轉字串

題目 定義乙個函式實現字串左旋轉操作的功能。字串的左旋轉操作就是把字串前面的若干個字元轉移到字串的 尾部。比如輸入字串 abcdefg 和2,該函式將返回左旋轉2位得到的結果 cdefgab include include using namespace std 翻轉字串 void reverse ...

筆試面試題之字串

最大子串行 最大子串行是要找出由數組成的一維陣列中和最大的連續子串行。比如的最大子串行就是 它的和是8,達到最大 而 的最大子串行是,它的和是6。你已經看出來了,找最大子串行的方法很簡單,只要前i項的和還沒有小於0那麼子串行就一直向後擴充套件,否則丟棄之前的子串行開始新的子串行,同時我們要記下各個子...