每天开心一点

Python: 每日一题 43

2017-11-27 13:29:00    六月    620    来源: http://bbs.fishc.com/thread-87065-1-1.html

给定一个由数值组成的列表(array)和一个整数(interger),返回列表中相加之和等于整数的两个数。
列表长度最长为1000万,用时不超过12秒(好像是1.2秒,还是7秒,好烦没有给出明确时间)。

由于这个编辑器的关系,我实在没有办法正常对齐,所以你们就将就着看吧.
  1. sum_pairs([11, 3, 7, 5],         10)
  2. #                 ^-^      3 + 7 = 10
  3. == [3, 7]

  4. sum_pairs([4, 3, 2, 3, 4],         6)
  5. #           ^---^         4 + 2 = 6, index: 0, 2 *
  6. #             ^---^      3 + 3 = 6, index: 1, 3
  7. #                 ^---^   2 + 4 = 6, index:  2, 4
  8. #  * 返回整体最早出现的答案
  9. == [4, 2]

  10. sum_pairs([0, 0, -2, 3], 2)
  11. #  没有可以相加成2的组合.
  12. == None

  13. sum_pairs([10, 5, 2, 3, 7, 5],         10)
  14. #                 ^--------^   5 + 5 = 10, index: 1, 5
  15. #                    ^-^      3 + 7 = 10, index: 3, 4 *
  16. #  * 返回整体最早出现的答案
  17. == [3, 7]
复制代码


测试代码:
先更新一些test.py
  1. def assert_equals(func, target, *args):
  2.     if func == target:
  3.         print('Success!')
  4.     else:
  5.         print('Fail!{0} not equals {1}'.format(func, target))
  6.         print(*args)
复制代码

  1. l1 = [1, 4, 8, 7, 3, 15]
  2. l2 = [1, -2, 3, 0, -6, 1]
  3. l3 = [20, -13, 40]
  4. l4 = [1, 2, 3, 4, 1, 0]
  5. l5 = [10, 5, 2, 3, 7, 5]
  6. l6 = [4, -2, 3, 3, 4]
  7. l7 = [0, 2, 0]
  8. l8 = [5, 9, 13, -3]

  9. test.assert_equals(sum_pairs(l1, 8), [1, 7], "Basic: %s should return [1, 7] for sum = 8" % l1)
  10. test.assert_equals(sum_pairs(l2, -6), [0, -6], "Negatives: %s should return [0, -6] for sum = -6" % l2)
  11. test.assert_equals(sum_pairs(l3, -7), None, "No Match: %s should return None for sum = -7" % l3)
  12. test.assert_equals(sum_pairs(l4, 2), [1, 1], "First Match From Left: %s should return [1, 1] for sum = 2 " % l4)
  13. test.assert_equals(sum_pairs(l5, 10), [3, 7],
  14.                    "First Match From Left REDUX!: %s should return [3, 7] for sum = 10 " % l5)
  15. test.assert_equals(sum_pairs(l6, 8), [4, 4], "Duplicates: %s should return [4, 4] for sum = 8" % l6)
  16. test.assert_equals(sum_pairs(l7, 0), [0, 0], "Zeroes: %s should return [0, 0] for sum = 0" % l7)
  17. test.assert_equals(sum_pairs(l8, 10), [13, -3], "Subtraction: %s should return [13, -3] for sum = 10" % l8)