1. 程式人生 > >面試題之O(n)內旋轉字符串

面試題之O(n)內旋轉字符串

col 旋轉字符串 方案 面試 長度 字符 特點 發現 慣性

樣例:

字符串“abcd1234"左移3位結果為”234abcd1“

K:左移位數

L:字符串長度

方案1:暴力 O(K * L)

可以每次將數組中的元素左移一位,循環K次。

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

算法復雜度為O(K * L)

方案2:暴力+公式變形 O(N^2)

大家開始可能會有這樣的潛在假設,K<L。事實上,很多時候也的確是這樣的。但嚴格來說,我們不能用這樣的“慣性思維”來思考問題。尤其在編程的時候,全面地考慮問題是很重要的,K可能是一個遠大於L的整數,在這個時候,上面的解法是需要改進的。仔細觀察循環左移的特點,不難發現:每個元素左移L位後都會回到自己的位置上。因此,如果K > L,左移K-L之後的數組序列跟左移K位的結果是一樣的,進而可得出一條通用的規律:

左移K位之後的情形,跟左移K= K % N位之後的情形一樣

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

三次翻轉操作:

第一次: adcd1變成1dcba

第二次: 234變成432

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

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

註意:如果左移位數K大於字符串長度L,那麽左移K位和左移K%L結果是一樣的

code:

#include <bits/stdc++.h>
using namespace std;
void f(char str[],int x,int y)
{
    for
(;x<y;x++,y--) { char temp=str[y]; str[y]=str[x]; str[x]=temp; } } int main() { char str[8]={a,b,c,d,1,2,3,4}; 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
<<str<<endl; f(str,l-k,l-1); cout<<str<<endl; f(str,0,l-1); cout<<str<<endl; return 0; }

面試題之O(n)內旋轉字符串