作者dadadavid (大大大卫)
看板Python
标题Re: [讨论] 用python找出一串数字中最长的"二数数串"
时间Thu Sep 26 08:49:49 2013
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)