Python 板


LINE

※ 引述《mystea (mystea)》之銘言: : 這是一個軟體公司過往的面試題目. : 給定一個任意的數串, 比方說: : numstring = '889988899278392520771323543282829292222943485709' : 請用python找出最長的, 只有兩種數字的子數列. 在前述的例子裡, : 答案是889988899 和 292922229. 保留題目~ 上面的解法都是 O(n^2),但這題其實有 O(n) 解 概念與 "最大連續整數合" 的題型很像 以下是我的解法,如果有 bug 也請大家不吝指正! 演算法:用 i 走過 numstring 一次,在走訪時要維護 diff1_ptr: 從 i 往前的第一個不同數字的起始位置 diff2_ptr: 從 i 往前的第二個不同數字的起始位置 num_set: 從 i 往前到 diff2_ptr 間的數字 (必定只有 2 個) num_set 是維護 diff1_ptr diff2_ptr 用的 [diff2_ptr: i+1] 一定會是一個合法字串,沿途記錄最大即可 ex: 7 7 9 9 9 8 8 7 8 8 8 5 #1 7 1 <-- 1 表示 diff1_ptr 位置 2 表示 diff2_ptr 位置 #2 7 7 1 #3 7 7 9 2 1 <-- diff2_ptr 到 "現在走訪到的位置" 因此 779 會是一個合法子字串 #4 7 7 9 9 2 1 #5 7 7 9 9 9 2 1 <-- 此時的合法字串為 77999 比以前都長所以會被記錄下來 #6 7 7 9 9 9 8 2 1 <-- 8 不在之前的 set 裡(79) 所以 ptr 會換位置,此時合法字串是 9998 #7 7 7 9 9 9 8 8 2 1 #8 7 7 9 9 9 8 8 7 2 1 <-- 在 ptr 換位前,合法字串是 99988 只有跟 77999 同長而已 #9 7 7 9 9 9 8 8 7 8 2 1 #10 7 7 9 9 9 8 8 7 8 8 2 1 #11 7 7 9 9 9 8 8 7 8 8 8 2 1 <-- 此時合法字串是 887888,比 99988 更長 因此答案更新 #12 7 7 9 9 9 8 8 7 8 8 8 5 2 1 <-- 結束 於是在走訪時會有三種狀況: 1. aabbb c 走到一個以前沒出現過的字 2 1 現在走到 c 與前一個元素 b 不同,因此 diff1_ptr 要更新到 c 的位置 因為 c 以前沒出現過(和 a 不同),因此 diff2_ptr 也要更新 而 diff2_ptr 新的位置就會是 diff1_ptr 舊的位置,也就是變成 aabbbc 2 1 2. aabbb b 走到跟上個一樣的字 2 1 毫無反應,diff1_ptr diff2_ptr 皆不用更新 3. aabbb a 走到跟上個不同的字,但以前出現過 2 1 跟上次不同 diff1_ptr 就一定會更新,但沒有出現新字所以 diff2_ptr 不用動 如此做是為了讓接下來如果出現新字,diff2_ptr 更新時可以一口氣丟掉 有 b 的部份(遇到新字就是狀況 1,diff2_ptr 會更新到 diff1_ptr 的位置) aabbba 2 1 講了半天,以下是 code numstring = "889988899278392520771323543282829292222943485709" ans = [''] num_set = set() diff2_ptr, diff1_ptr = 0, 0 for i in range(len(numstring)): if numstring[i] not in num_set: # cond 1 diff2_ptr, diff1_ptr = diff1_ptr, i num_set = set([numstring[i], numstring[diff2_ptr]]) elif numstring[i] == numstring[i-1]: # cond 2 pass else: # cond 3 diff1_ptr = i # replace ans if longer if i+1 - diff2_ptr > len(ans[0]): ans = [ numstring[diff2_ptr:i+1] ] # append to ans if equal long elif i+1 - diff2_ptr == len(ans[0]): ans.append( numstring[diff2_ptr:i+1] ) print ans -- 光明 的背後 是 黑暗 黑暗 的背後 還是 黑暗 由此可知 黑暗 > 光明 Q.E.D. --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.235.135
1F:推 carlcarl:Good~ 09/27 00:36
2F:推 dadadavid:這裡有資工魂 09/27 08:26
3F:推 s0914714:解法真棒!不過#4 diff1_ptr的位置應該在第一個9吧? 09/27 11:15
恩恩標錯了XD 已修正,感謝提醒! ※ 編輯: darkgerm 來自: 140.113.235.135 (09/27 11:16)
4F:推 s860134:演算法上的勝利阿! 09/27 18:39
5F:推 mystea:謝謝大家的熱情回應, 獲益良多. :) 09/27 23:48
6F:推 cobrasgo:這就是value 09/28 13:55
7F:推 changyuheng:http://ppt.cc/obN4 09/28 19:48
8F:推 jlhc:感謝 09/30 01:35







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:WOW站內搜尋

TOP