我在 codewars 中收到“执行超时(12000 毫秒)”

问题描述 投票:0回答:1

这是任务 三角洲发电机 在数学中,符号 Δ 和 d 常用于表示两个值之间的差值。同样,微分采用线性关系的变化率(即 dy/dx)。可以多次应用此方法来创建多个“级别”的变化率。 (一个常见的例子是 x(位置)-> v(速度)-> a(加速度))。

今天我们将创建一个类似的概念。我们的函数 delta 将采用一系列值和一个正整数级别,并返回一个具有原始值“差异”的序列。 (这里的差异意味着严格的 b - a,例如 [1, 3, 2] => [2, -1])参数级别是差异的“级别”,例如加速度是第二个“级别”的差异位置。输入和输出列表的具体编码在下面指定。

下面的示例显示了同一输入的三个不同“级别”。

input = [1, 2, 4, 7, 11, 16, 22]
list(delta(input, 1)) # [1, 2, 3, 4, 5, 6]
list(delta(input, 2)) # [1, 1, 1, 1, 1]
list(delta(input, 3)) # [0, 0, 0, 0]

这是我对这个问题的解决方案

def delta(values, n):
    lst=[]
    values=list(values).copy()
    for i in range(n):
        lst.clear()
        lst=[0]*(len(values)-1)
        for j in range(1,len(values)):
            #lst.append(values[j]-values[j-1])
            lst[j-1]=values[j]-values[j-1]
            #print(lst)
        values.clear()
        values=lst.copy()
    return values

首先我使用了一个方法

append()
但是它说“执行超时(12000毫秒)”。然后我尝试了另一件事来将值添加到 lst 并再次出现相同的问题。 请寻求帮助,因为我最近开始学习编程:)))

python list append
1个回答
-1
投票

由于

values
可以无限大,您必须一次处理一个内容。你不能把它放在数组中,因为你没有无限的内存,这意味着你不能使用索引来访问项目。您需要做的是编写一个生成器,一次执行一个减法,只跟踪执行此操作所需的两个元素:当前项目和最后一个。

以下是“1 级”的操作方法。 (我们暂时忽略

n
。)

def delta(values, n):
    values = iter(values)
    a = next(values)
    for b in values:
        yield b - a
        a = b

在这里可能会绊倒你的一件事是使用

iter()
。如果
iter()
的参数是一个容器,
iter()
返回一个容器上的迭代器。如果它已经是一个迭代器,
iter()
返回相同的迭代器。所以在这种情况下,这是一种让我们的函数接受列表或迭代器的方法,因为它需要这样做。

一旦有了迭代器,我们就可以使用

next()
从中获取第一个值。这样我们就可以从第二个值中减去一个初始值。循环实际上循环遍历
2
n
因为我们已经用
next()
得到了第一个值。

现在要添加级别,您需要递归。对于大于 1 的

n
值,不是直接迭代
values
中的项目,而是迭代
delta(values, n-1)
中的项目。当
n
为 1 时,您直接迭代
values
.

看起来像这样:

def delta(values, n):
    if n > 1:
        values = delta(values, n-1)
    values = iter(values)
    a = next(values)
    for b in values:
        yield b - a
        a = b

整个练习是测试你是否理解生成器和递归。如果您不理解我的解决方案,请花一些时间研究这些概念。

© www.soinside.com 2019 - 2024. All rights reserved.