生活随笔
收集整理的這篇文章主要介紹了
字符串旋转与移位
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
? ? ?在好多字符串處理中,旋轉與移位是很常見到的,在大規模的數據處理中設計高效的算法是必須的
示例:
把字符串abcdefgh循環左移3位,變為defghabc
輸入字符串str與移位數m,輸出結果
1、看到題之后一般的想法就是一位一位的移動
- abcdefgh
- bcdefgha
- cdefghab
- defghabc
??????實現代碼如下
?
[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;?? ????}?? }??
????????這樣算法的時間復雜度為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、接下來這種方法是利用字符串的翻轉
???? 先把字符串按移位的個數分為兩部分,abc 與 defgh
???? 思想是先對第一部分反轉交換,第一個與最后一個交換,依次類推,交換之后分別為 cba 與 hgfed
???? 最后對所得的字符串cbahgfed整體翻轉,結果為defghabc,即我們要得到的結果
??? 實現代碼如下:
??? 字符串翻轉函數:
[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、最后一種方法是用最大公約數法,移動字符
???? 利用公式? index=(i+m*j)%n
??? 設m與n的最大公約數為k,則i為從0到k-1循環k次
??? 如在示例中m=3,n=7,最大公約數為1,所以i只為0
??? 下標計算結果為:0,3,6,2,5,1,4,0
???? 依照這樣的順序進行移位,最后得到最終的結果
?? 實現代碼如下:
[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">小結:總共介紹了4中字符串旋轉的方法,其中第四種字符移動次數最少</span></p>?? <pre></pre>?? <pre></pre>?? <pre></pre>?? <pre></pre>?? <pre></pre>?? <pre><span?style="font-size:16px">當然,如果是循環右移m位,可以轉變為循環左移n-m位</span></pre>?? <pre></pre>?? ?????? ????????<div?style="padding-top:20px">??????????? ????????????<p?style="font-size:12px;">版權聲明:本文為博主原創文章,未經博主允許不得轉載。</p>?? ????????</div> ?
總結
以上是生活随笔為你收集整理的字符串旋转与移位的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。