日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

程序员编程艺术第一章(第二节)

發(fā)布時(shí)間:2025/4/16 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序员编程艺术第一章(第二节) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

第二節(jié):兩指針逐步翻轉(zhuǎn)

思路:
abc defghi,要 abc 移動(dòng)至最后
abc defghi->def abcghi->def ghiabc
定義倆指針, p1 指向 ch[0], p2 指向 ch[m];
一下過(guò)程循環(huán) m 次,交換 p1 和 p2 所指元素,然后 p1++, p2++;。


第一步,交換 abc 和 def ,
abc defghi->def abcghi


第二步,交換 abc 和 ghi,
def abcghi->def ghiabc


整個(gè)過(guò)程,看起來(lái),就是 abc 一步一步 向后移動(dòng)
abc defghi
def abcghi
def ghi abc


這個(gè)有個(gè)限制,如果字符串的個(gè)數(shù)正好是平移位的整數(shù)倍還好,如果不是 的話還要進(jìn)行調(diào)整:

由上述例子九個(gè)元素的序列 abcdefghi,您已經(jīng)看到, m=3 時(shí), p2 恰好指到了數(shù)組最后
一個(gè)元素,于是,上述思路沒(méi)有問(wèn)題。 但如果上面例子中 i 的后面還有元素列?
即,如果是要左旋十個(gè)元素的序列: abcdefghij ok,下面,就舉這個(gè)例子,對(duì) abcdefghij
序列進(jìn)行左旋轉(zhuǎn)操作:
如果 abcdef ghij 要變成 defghij abc:
abcdef ghij
1. def abc ghij
2. def ghi abc j //接下來(lái), j 步步前移
3. def ghi ab jc
4. def ghi a j bc
5. def ghi j abc
下面,再針對(duì)上述過(guò)程,畫個(gè)圖清晰說(shuō)明下,如下所示:


def ghi abc jk
當(dāng) p1 指向 a, p2 指向 j 時(shí),由于 p2+m 越界,那么此時(shí) p1, p2 不要變
這里 p1 之后( abcjk)就是尾巴,處理尾巴只需將 j,k 移到 abc 之前,得到最終序列,代碼
編寫如下:

#include<iostream> #include<string> using namespace std; void rotate(string & str, int m) {if(str.length() == 0 || m <= 0)return;int n = str.length();if (m%n <= 0)return;int p1 = 0, p2 = m;int k = (n - m) - n%m;//表示可以平移的位數(shù)while (k--){swap(str[p1], str[p2]);p1++;p2++;}//表示平移到了界限出 就是后面的字符串的個(gè)數(shù)不夠平移的位數(shù) //下面考慮怎么設(shè)置吧剩余的字符串 進(jìn)行平移int r = n - p2;while (r--){int i = p2;while (i > p1){swap(str[i], str[i - 1]);i--;}p2++;p1++;} } int main() {string ch = "abcdefghijk";rotate(ch, 3);cout<<ch << endl;system("pause");return 0; }


總結(jié)

以上是生活随笔為你收集整理的程序员编程艺术第一章(第二节)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。