一道穷举法算法题

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 题目是在topcoder看到的,但是不小心关了,不记得是题号了。 题目如下: 给定一组数,求哪这组数字能够组成的最长连续子序列,但其中比较特殊的是0可以代替任何数 注意: 其中的数字可以重复 限制条件: 数字的返回是从 0 ~ 1000000 包含0, 1000000 这组数的数量不超过 50 0, 6, 5, 10, 3, 0, 11 返回 5 解释: 如果把两个0,一个当做4, 一个当做7 那么可以得到最长连续子序列是 3, 4, 5, 6, 7 如果把两个0, 一个当做2, 一个当做4 那么可以得到最长连续子序列是 2, 3, 4, 5, 6 100,100,100,101,100,99,97,103 返回 3 解释: 最长连续子序列是 99, 100, 101 0, 0, 0, 1 , 2, 6, 8, 1000 返回 6 解释: 最长连续子序列是 1, 2, 3, 4, 5, 6 ...

January 2, 2018 · 2 min

算法题(3)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 在不考虑闰年,润日的情况下计算某人的下一次生日 from datetime import datetime, timedelta def solve(birthday): now = datetime.now() now = datetime(now.year, now.month, now.day) year = (now.year - birthday.year) + birthday.year x = datetime(year, birthday.month, birthday.day) if x < now: x = datetime(x.year + 1 , x.month, x.day ) return x else: return x b1 = datetime(1985, 11, 1) print solve(b1) b2 = datetime(1982, 3, 15) print solve(b2) b3 = datetime(1985, 7, 15) print solve(b3) ~

January 1, 2018 · 1 min

算法题(4)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 题目: 有十个球编号分别为 0 ~ n - 1 ,放在袋中,任意抓2个,求所有可能的情况 def choice2(n): ll = [] for i in range(n): for j in range(i+1, n): ll.append((i, j)) return ll res = choice2(10) print len(res)

January 1, 2018 · 1 min

算法题(5)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 题目: 已知一条线段从0 到 10000,给定一个L线段(x,y), 找出所有包含线段L线段 如下图所示,假定 (x, y) 为 (2,4) , 所有能否覆盖L线段的组合为 (0, 4) (0, 5) (0, 6) (1, 4) (1, 5) (1, 6) (2, 4) (2, 5) (2, 6) 解题思路: 观察线段可以看出所有能否覆盖L线段的组合(t1, t2), 左侧的坐标点t1必须满足 0 <= t1 <= x 右侧的坐标点t2 必须满足 y<= t2 <= 10000 def find_segment(x, y): res_list = [] for t1 in range(0, x + 1): for t2 in range(y, 10000 + 1): res_list.append((t1, t2)) return res_list print find_segment(2, 4) 如果要求所有重叠的线段,该怎么做?

January 1, 2018 · 1 min

算法题(6)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 题目: 已知一个矩阵 matrix = [ [&#039;A&#039;, &#039;P&#039;, &#039;H&#039;, &#039;S&#039;], [&#039;U&#039;, &#039;L&#039;, &#039;O&#039;, &#039;A&#039;], [&#039;O&#039;, &#039;M&#039;, &#039;L&#039;, &#039;K&#039;], [&#039;F&#039;, &#039;B&#039;, &#039;I&#039;, &#039;R&#039;], ] 在矩阵中查找多个字符串,字符串的数量可能很多 [&quot;LFK&quot;, &quot;HMM&quot;, &quot;RPOOI&quot;] 对于字符串"LFK",它由3个字符组成,‘L’、‘F’、‘K’ 这三个字符在矩阵中的位置分别为(1,1),(3,0),(2,3) 对于这个三个字符串分别返回 LFK True, [(1,1),(3,0),(2,3)] HMM 矩阵中的每个字符只能被使用一次,字符M在矩阵中只有一个,因此 HMM 无法找到 False, [] RPOOI True, [(3,3),(0,1),(1,2),(2,0),(3,2)] 分析 矩阵中的字符数量有限(全是大写字母),且每个字符只能被使用一次,由于待查的字符串数量很多,所以需要为查找建立索引 最终代码如下: # encoding=utf-8 from collections import defaultdict def get_position(matrix, str_list): # 初始化索引 dd = defaultdict(list) for i in range(len(matrix)): for j in range(len(matrix[i])): ch = matrix[i][j] dd[ch].append((i, j)) # deal res = [] for ss in str_list: print ss curr_dd = defaultdict(int) flag = True position_list = [] for ch in ss: curr_dd[ch] += 1 if curr_dd[ch] &lt;= len(dd[ch]): position_list.append(dd[ch][curr_dd[ch] - 1 ]) else: flag = False res.append((False, [])) break if flag: res.append((True, position_list)) return res if __name__ == &#039;__main__&#039;: matrix = [ [&#039;A&#039;, &#039;P&#039;, &#039;H&#039;, &#039;S&#039;], [&#039;U&#039;, &#039;L&#039;, &#039;O&#039;, &#039;A&#039;], [&#039;O&#039;, &#039;M&#039;, &#039;L&#039;, &#039;K&#039;], [&#039;F&#039;, &#039;B&#039;, &#039;I&#039;, &#039;R&#039;], ] str_list = [&quot;ISIS&quot;, &quot;ALLAHU&quot;] res = get_position(matrix, str_list) for item in res: print item

January 1, 2018 · 1 min