Python算法之旅列表的紛爭(zhēng)之雙指針掃描

出場(chǎng)人物介紹:

小美:小學(xué)4年級(jí)學(xué)生,參加了學(xué)校的編程興趣小組,已經(jīng)了解了Python語(yǔ)言的基本語(yǔ)法进苍,能夠看懂一些簡(jiǎn)單的程序。她做事風(fēng)風(fēng)火火鸭叙,對(duì)所有的事情都很好奇觉啊,喜歡打破砂鍋問(wèn)到底,是一個(gè)叫人又愛(ài)又恨的小丫頭沈贝。

阿福:一個(gè)酷愛(ài)編程的8年級(jí)男生杠人。大家都說(shuō)他長(zhǎng)得像國(guó)寶大熊貓,動(dòng)作緩慢,憨態(tài)可掬嗡善。他做事情確實(shí)夠慢的辑莫,連說(shuō)話也慢條斯理,可是他一點(diǎn)也不擔(dān)心罩引,他常常說(shuō):“慢就是快各吨,只要堅(jiān)持下去,蝸牛也能爬上金字塔袁铐〗已眩”

古老師:雖然年近不惑,但依然對(duì)生活充滿熱情剔桨√敫“愛(ài)生活?lèi)?ài)運(yùn)動(dòng)”是他的人生信條,和孩子們一起編程是他最大的樂(lè)趣领炫。他神出鬼沒(méi)偶垮,總是在孩子們最需要幫助的時(shí)候出現(xiàn)。當(dāng)然帝洪,你也不能動(dòng)不動(dòng)就找古老師似舵,因?yàn)樗苊Γ浅7浅CΥ邢俊K匝饣龅絾?wèn)題還是自己先思考吧。


正文

列表的紛爭(zhēng)之雙指針掃描


小美:最近我們學(xué)習(xí)了一種新的數(shù)據(jù)結(jié)構(gòu)——列表砰奕。列表比字符串靈活多了蛛芥,它不僅可以修改元素值,還可以隨意增加和刪除元素军援,功能十分強(qiáng)大仅淑。

阿福:是啊,列表是Python語(yǔ)言中使用非常廣泛的一種數(shù)據(jù)結(jié)構(gòu)胸哥,它的內(nèi)置函數(shù)很豐富涯竟,功能十分強(qiáng)大。

小美:列表的內(nèi)置函數(shù)確實(shí)太“豐富”了空厌,我怎么也記不住庐船。對(duì)了,阿福你是怎么記住這些函數(shù)的呢嘲更?

阿福:我也沒(méi)什么好的方法筐钟,就是多記多用唄。

古老師:沒(méi)錯(cuò)赋朦,學(xué)習(xí)不能老想著走捷徑篓冲!成功的秘訣就是熟能生巧李破。不過(guò)要想深刻地理解Python的內(nèi)置函數(shù),除了多運(yùn)用它們解決實(shí)際問(wèn)題以外纹因,嘗試自定義函數(shù)來(lái)實(shí)現(xiàn)相同的功能也是一種很好的方法喷屋。

小美:自定義函數(shù)?

阿福:用戶自己創(chuàng)造的用來(lái)實(shí)現(xiàn)某種特定功能的函數(shù)就叫自定義函數(shù)瞭恰。

古老師:阿福說(shuō)的沒(méi)錯(cuò)屯曹。那我今天就來(lái)考考你們,能否編寫(xiě)一個(gè)自定義函數(shù)來(lái)實(shí)現(xiàn)列表中reverse()方法的功能惊畏。


知識(shí)小貼士:

Python3 List? reverse()方法:reverse() 函數(shù)用于反向列表中元素恶耽。它的語(yǔ)法是list.reverse(),該方法沒(méi)有形式參數(shù)颜启,也沒(méi)有返回值偷俭,但是會(huì)對(duì)列表的元素進(jìn)行反向排序。


小美:這有什么難的缰盏,看我的涌萤!


問(wèn)題1:

反向列表中元素

函數(shù)功能:將輸入的列表的元素進(jìn)行反向排序

函數(shù)名:my_reverse(a:list) -> None

參數(shù)表:a -- 列表。

返回值:該函數(shù)沒(méi)有返回值口猜,但是會(huì)對(duì)列表a的元素進(jìn)行反向排序负溪。

示例:輸入a=[1,6,5,2],函數(shù)運(yùn)行后a=[2,5,6,1]


代碼1:

defmy_reverse(a: list) -> None:

??? n = len(a)

??? for i in range(n//2):

??????? a[i], a[n-i-1] = a[n-i-1], a[i]


阿福:我也寫(xiě)好了济炎。


代碼2:

defmy_reverse2(a: list) -> None:

??? L, R = 0, len(a) - 1

??? while L < R:

??????? a[L], a[R] = a[R], a[L]

????? ??L, R = L + 1, R – 1


古老師:都很棒川抡!小美使用單指針掃描技術(shù),分別用a[i]和a[n-i-1]來(lái)表示兩個(gè)對(duì)稱(chēng)的元素须尚,讓它們進(jìn)行交換操作崖堤,這樣只需使用一個(gè)循環(huán)變量掃描半個(gè)列表,代碼簡(jiǎn)潔耐床,效率也很高密幔。但我更推崇阿福的做法,他使用了所謂的雙指針掃描技術(shù)撩轰,分別用L和R兩個(gè)變量從兩邊向中間掃描老玛,直接交換a[L]和a[R],直到L和R相遇钧敞。這種做法思路非常清晰,代碼的含義也很明確麸粮,是可讀性很強(qiáng)的代碼溉苛。

阿福:謝謝老師夸獎(jiǎng)!呵呵弄诲。

小美:看你美的愚战!不就是雙指針嗎娇唯?功能還不是和我的單指針一樣?說(shuō)不定效率還沒(méi)有我的高呢寂玲!

古老師:小美你還別不服氣塔插,雙指針掃描確實(shí)是一種既好看又實(shí)用的方法,很多時(shí)候它能完成單指針?biāo)霾坏降氖虑橥赜础1热缦旅孢@個(gè)例子:


問(wèn)題2:

奇偶數(shù)分組

函數(shù)功能:將輸入的列表元素按照奇偶性分組想许,其中奇數(shù)劃到左側(cè),偶數(shù)劃到右側(cè)

函數(shù)名:group(a: list)-> None

參數(shù)表:a -- 列表断序。

返回值:該函數(shù)沒(méi)有返回值流纹,但是會(huì)對(duì)列表a的元素按照奇偶性分組。

示例:輸入a=[1,6,5,2]违诗,函數(shù)運(yùn)行后a=[1,5,6,2]


小美:奇偶數(shù)分組漱凝?要用到雙指針掃描?該怎么做呢诸迟?

古老師:又到了說(shuō)再見(jiàn)的時(shí)候了茸炒。你們先自己想想看吧,實(shí)在做不出再來(lái)找我阵苇,先走了壁公,拜拜。


彩蛋:

小美:古老師每次都賣(mài)關(guān)子慎玖。阿福贮尖,你想到辦法了嗎?

阿福:有點(diǎn)思路了趁怔,好像跟反轉(zhuǎn)列表的方法差不多湿硝,但這里需要用到二重循環(huán),否則不好表達(dá)润努。小美关斜,你知道二重循環(huán)嗎?

小美:知道啊铺浇,不就是循環(huán)里面套循環(huán)嘛痢畜。

阿福:知道就好,我還怕你看不懂我寫(xiě)的程序呢鳍侣。你看:


代碼3:

def group(a:list) -> None:

??? L, R = 0, len(a) - 1

??? while L < R:

??????? while a[L] % 2 == 1: #跳過(guò)左側(cè)的奇數(shù)

??????????? L += 1

??????? while a[R] % 2 == 0: #跳過(guò)右側(cè)的偶數(shù)

??????????? R -= 1

??????? if L < R:

??????????? a[L], a[R] = a[R], a[L]#將元素交換到正確的一側(cè)

??????????? L, R = L + 1, R - 1 #交換好后各自前行一步丁稀,效率更高

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市倚聚,隨后出現(xiàn)的幾起案子线衫,更是在濱河造成了極大的恐慌,老刑警劉巖惑折,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件授账,死亡現(xiàn)場(chǎng)離奇詭異枯跑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)白热,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)敛助,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人屋确,你說(shuō)我怎么就攤上這事纳击。” “怎么了乍恐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵评疗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我茵烈,道長(zhǎng)百匆,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任呜投,我火速辦了婚禮加匈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仑荐。我一直安慰自己雕拼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布粘招。 她就那樣靜靜地躺著啥寇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洒扎。 梳的紋絲不亂的頭發(fā)上辑甜,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音袍冷,去河邊找鬼磷醋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛胡诗,可吹牛的內(nèi)容都是我干的邓线。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼煌恢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼骇陈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瑰抵,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缩歪,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后谍憔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體匪蝙,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年习贫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逛球。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡苫昌,死狀恐怖颤绕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祟身,我是刑警寧澤奥务,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站袜硫,受9級(jí)特大地震影響氯葬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婉陷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一帚称、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秽澳,春花似錦闯睹、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至妄讯,卻和暖如春孩锡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捞挥。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工浮创, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留流礁,地道東北人忆谓。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晕粪,于是被迫代替她去往敵國(guó)和親讹俊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垦沉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 慎獨(dú)。獨(dú)仍劈,小人和君子都有的境地厕倍。可以理解為獨(dú)處贩疙,獨(dú)自讹弯,在無(wú)人知道的情況下况既。小人在這種情況下,就會(huì)生出妄想组民,因?yàn)樽杂X(jué)...
    王斌_addc閱讀 210評(píng)論 0 1
  • TextBox TextBox控件:文本框控件棒仍,用于獲取用戶輸入或顯示文本 屬性 名稱(chēng):Name 文字:Text...
    3d3827b9d942閱讀 178評(píng)論 1 0
  • 今天我給大家講一下我自己編的笑話吧,這是我以抖音上的一個(gè)圖片編出來(lái)的臭胜。 第一個(gè)是:小明對(duì)老師說(shuō):“...
    45cbff51831c閱讀 858評(píng)論 1 4
  • 總以為耸三,二十歲出頭的我們還很年輕乱陡,結(jié)婚離我們還很遙遠(yuǎn)∫亲常可是憨颠,當(dāng)身邊的同齡人都在開(kāi)始著手結(jié)婚這件事的時(shí)...
    一頭會(huì)飛的豬閱讀 1,530評(píng)論 4 2