这是一个编程挑战,需要根据序列起始数和间隔长度生成XOR校验和。
它要求您基于间隔长度迭代序列,并在每次迭代时保持减少选用的元素数进行校验计算。
例如:
如果起始数字为0且间隔长度为3,则过程如下:
0 1 2 /
3 4 / 5
6 / 7 8
其中XOR (^) 校验和为0^1^2^3^4^6 == 2
同样,如果起始数字为17且间隔长度为4,则过程如下:
17 18 19 20 /
21 22 23 / 24
25 26 / 27 28
29 / 30 31 32
这将产生校验和17^18^19^20^21^22^23^25^26^29 == 14
我的解决方案方法是使用递归。
它要求您基于间隔长度迭代序列,并在每次迭代时保持减少选用的元素数进行校验计算。
例如:
如果起始数字为0且间隔长度为3,则过程如下:
0 1 2 /
3 4 / 5
6 / 7 8
其中XOR (^) 校验和为0^1^2^3^4^6 == 2
同样,如果起始数字为17且间隔长度为4,则过程如下:
17 18 19 20 /
21 22 23 / 24
25 26 / 27 28
29 / 30 31 32
这将产生校验和17^18^19^20^21^22^23^25^26^29 == 14
我的解决方案方法是使用递归。
import operator
import sys
sys.setrecursionlimit(20000)
def answer(start, length):
lst = [range(start+length*n, start+length*n+length) for n in xrange(length)]
return my_reduce(lst, length)
def my_reduce(lst, length):
if not lst: return 0
l = lst.pop(0)
return reduce(operator.xor, l[:length], 0) ^ my_reduce(lst, length-1)
使用生成器的迭代方法
def answer(start, length):
return reduce(operator.xor, gen_nums(start, length))
def gen_nums(start, length):
l = length
while l > 0:
for x in xrange(start, start+l):
yield x
start = start + length
l = l - 1
问题
我的两种方法运行速度不够快。
它们对于一些简单的计算,例如例子中的计算,表现良好,但当区间长度较大时(例如1000),它们需要显著更多的时间。
问题
- 这个挑战测试了哪些计算机科学概念?
- 什么是正确的算法方法?
- 应该使用哪些正确的数据结构?
我需要理解为什么我的解决方案性能不佳,以及哪种算法和数据结构适合这个挑战。