Re: [討論] 用python找出一串數字中最長的"二數數串"

看板Python作者 (大大大衛)時間12年前 (2013/09/26 08:49), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/5 (看更多)
numstring = "889988899278392520771323543282829292222943485709" def ngram(n, iter_tokens): """Return a generator of n-gram from an iterable""" z = len(iter_tokens) return (iter_tokens[i:i+n] for i in xrange(z-n+1)) for i in range(len(numstring), 1, -1): results = [ng for ng in ngram(i, numstring) if len(set(ng))==2] if len(results) > 0: print results break ※ 引述《mystea (mystea)》之銘言: : 這是一個軟體公司過往的面試題目. : 給定一個任意的數串, 比方說: : numstring = '889988899278392520771323543282829292222943485709' : 請用python找出最長的, 只有兩種數字的子數列. 在前述的例子裡, : 答案是889988899 和 292922229. : 我個人的解答如下: : numstring = '889988899278392520771323543282829292222943485709' : slen = len(numstring) : candidate={} : length_of_string=[] : next_i = 0 : start_index=[] : ii=0 : while (next_i + ii != slen-1): : record = True : candidate = {} : start_index.append(next_i) : for ii, j in enumerate(s[next_i:]): : if j in candidate: candidate[j] += 1 : else: candidate[j] = 1 : if (len(candidate) == 2 and record): : next_i += ii : record = False : if len(candidate) > 2: break : length_of_string.append(ii+1) : smax = max(length_of_string) : sstarts = [start_index[i] for i in range(len(length_of_string)) if length_of_string[i]==smax] : finalresult = [s[a:a+smax-1] for a in sstarts] : print(finalresult) : 想請教版友們有沒有其他的方法? 另外, 由於我台接觸python不久, 想請問我的 : 方法是否有多餘的地方? 謝謝. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.69.179.66 ※ 編輯: dadadavid 來自: 203.69.179.66 (09/26 08:50)
文章代碼(AID): #1IGuImJj (Python)
討論串 (同標題文章)
文章代碼(AID): #1IGuImJj (Python)