生活随笔
收集整理的這篇文章主要介紹了
字符串旋转与移位
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
? ? ?在好多字符串處理中,旋轉(zhuǎn)與移位是很常見到的,在大規(guī)模的數(shù)據(jù)處理中設(shè)計高效的算法是必須的
示例:
把字符串a(chǎn)bcdefgh循環(huán)左移3位,變?yōu)閐efghabc
輸入字符串str與移位數(shù)m,輸出結(jié)果
1、看到題之后一般的想法就是一位一位的移動
- abcdefgh
- bcdefgha
- cdefghab
- defghabc
??????實現(xiàn)代碼如下
?
[cpp]?view plaincopy
??
[html]?view plaincopy
void?movebit(string?&str,int?num)?? {?? ????int?len=str.length();?? ????for?(int?i=0;i<num;++i)?? ????{?? ????????char?temp=str[0];?? ????????for?(int?j=1;j<len;++j)?? ????????{?? ????????????str[j-1]=str[j];?? ????????}?? ????????str[--j]=temp;?? ????}?? }??
????????這樣算法的時間復(fù)雜度為O(m*n)
2、在第一種方法中是一個字符一個字符的向后移動,這樣后邊的字符也得跟著移動m次,那么能不能一次就向后移動m個字符呢,答案是肯定的,這就是第二種方法,一次向后移動m個字符
- abcdefgh
- defabcgh
- defghcab
- defghabc
示例代碼如下:
[cpp]?view plaincopy
void?movechar(string?&?ch,int?num)?? {?? ????int?len=ch.length();?? ????if?(len<=0||num>=len)?? ????{?? ????????return;?? ????}?? ????int?first=0;?????????????????????? ????int?middle=num;?? ????int?second=middle;???????????????? ?????? ????while?(1)?? ????{?? ????????char?temp=ch[first];?? ????????ch[first]=ch[second];?? ????????ch[second]=temp;?? ????????first++;?? ????????second++;?? ????????if?(first==middle)?? ????????{?? ????????????if?(second>=len)?????????? ????????????{?? ????????????????return;?? ????????????}?? ????????????else?????????????????????? ????????????{?? ????????????????middle=second;?? ????????????}?? ????????}?? ????????else?if?(second>=len)????????? ????????{?? ????????????second=middle;?? ????????}?? ????}?? }??
3、接下來這種方法是利用字符串的翻轉(zhuǎn)
???? 先把字符串按移位的個數(shù)分為兩部分,abc 與 defgh
???? 思想是先對第一部分反轉(zhuǎn)交換,第一個與最后一個交換,依次類推,交換之后分別為 cba 與 hgfed
???? 最后對所得的字符串cbahgfed整體翻轉(zhuǎn),結(jié)果為defghabc,即我們要得到的結(jié)果
??? 實現(xiàn)代碼如下:
??? 字符串翻轉(zhuǎn)函數(shù):
[cpp]?view plaincopy
void?revote(char?*ch,int?start,int?end)?? {?? ????char?temp;?? ????while?(start<end)?? ????{?? ????????temp=ch[start];?? ????????ch[start]=ch[end];?? ????????ch[end]=temp;?? ????????++start;?? ????????--end;?? ????}?? }??
[cpp]?view plaincopy
void?translate(char?*?ch,int?num)?? {?? ?if?(ch==NULL||num<=0||num>=strlen(ch))?? ?{?? ??return;?? ?}?? ?revote(ch,0,num-1);????????????????????? ?revote(ch,num,strlen(ch)-1);???????????? ?revote(ch,0,strlen(ch)-1);?????????????? }??
4、最后一種方法是用最大公約數(shù)法,移動字符
???? 利用公式? index=(i+m*j)%n
??? 設(shè)m與n的最大公約數(shù)為k,則i為從0到k-1循環(huán)k次
??? 如在示例中m=3,n=7,最大公約數(shù)為1,所以i只為0
??? 下標(biāo)計算結(jié)果為:0,3,6,2,5,1,4,0
???? 依照這樣的順序進行移位,最后得到最終的結(jié)果
?? 實現(xiàn)代碼如下:
[java]?view plaincopy
?? int?GCD(int?m,int?n)?? {?? ????if?(n==0)?? ????{?? ????????return?m;?? ????}?? ????else??? ????{?? ????????return?GCD(n,m%n);?? ????}?? }??
[java]?view plaincopy
<pre?class="cpp"?name="code">void?Rotate(string?&str,int?num)?? {?? ????int?len=str.length();?? ????int?commonNum=GCD(len,num);?????????????????????? ????int?time=len/commonNum;?????????????????????????? ????for?(int?i=0;i<commonNum;++i)?? ????{?? ????????char?temp=str[i];?? ????????for?(int?j=0;j<time-1;++j)?? ????????{?? ????????????str[(i+j*num)%len]=str[(i+(j+1)*num)%len];???? ????????}?? ????????str[(i+j*num)%len]=temp;?? ????}?? }</pre><br>?? <pre></pre>?? <p><span?style="font-size:16px">小結(jié):總共介紹了4中字符串旋轉(zhuǎn)的方法,其中第四種字符移動次數(shù)最少</span></p>?? <pre></pre>?? <pre></pre>?? <pre></pre>?? <pre></pre>?? <pre></pre>?? <pre><span?style="font-size:16px">當(dāng)然,如果是循環(huán)右移m位,可以轉(zhuǎn)變?yōu)檠h(huán)左移n-m位</span></pre>?? <pre></pre>?? ?????? ????????<div?style="padding-top:20px">??????????? ????????????<p?style="font-size:12px;">版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。</p>?? ????????</div> ?
總結(jié)
以上是生活随笔為你收集整理的字符串旋转与移位的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。