白本羽 发表于 2021-5-12 22:49:07

每日一题的第55题,答案不同

有一个数列u,使得u符合以下规则:
1、u的第一个数字是1.
2、对于u中的每一个x,都有y=2*x+1 和z=3*x+1,且y和z都在u中。
3、u中没有其他数字。
复制代码

例如:
u =
复制代码


1--->y(1) = 3,z(1) = 4
3--->y(3) = 7,z(3) = 10
4--->y(4) = 9,z(4) = 13
....

要求:给出函数dbl_linear(n),返回按顺序排列的u。
例如: dlb_linear(10) 返回22.
注意:请考虑效率问题(1<n<100000)

参考答案的代码:
from collections import deque


def dbl_linear1(n):
    h = 1
    cnt = 0
    q2, q3 = deque([]), deque([])
    while True:
      if (cnt >= n):
            return h
      q2.append(2 * h + 1)
      q3.append(3 * h + 1)
      h = min(q2, q3)
      if h == q2: h = q2.popleft()
      if h == q3: h = q3.popleft()
      cnt += 1
输出是2911582。花费1s不到....

我的代码:
from timeit import timeit


def dlb_linear(n):
    u =
    length = len(u)
    num = 0
    while length <= n:
      x = 2 * u + 1
      y = 3 * u + 1
      u.append(x)
      u.append(y)
      u.sort(reverse = False)
      length = len(u)
      num += 1
    print(u)
    print(u)
    return u


t = timeit("dlb_linear(100000)", 'from __main__ import dlb_linear', number = 1)
print(t)
输出是2942626,花费9.22s

如果题目中的u列表是按从小到大排序的,那么x和y的生成也应该是从小到大,求指点哪里出了问题...为什么输出不一样?

qq1151985918 发表于 2021-5-13 09:20:53

本帖最后由 qq1151985918 于 2021-5-13 09:34 编辑

你的问题在于这一句

1--->y(1) = 3,z(1) = 4
3--->y(3) = 7,z(3) = 10
4--->y(4) = 9,z(4) = 13

理解不到位

实际上 y(4) < z(3) 这种情况你就没有作出处理,所以才会错误
而且你的 数组 u 在不断进行排序过程,索引值 num 是变化的
页: [1]
查看完整版本: 每日一题的第55题,答案不同