做一个递增的数组,同时修改数组

Posted

技术标签:

【中文标题】做一个递增的数组,同时修改数组【英文标题】:Make an increasing array, while modifying the array 【发布时间】:2021-05-23 01:55:16 【问题描述】:

问:给你一个包含 n 个整数的数组。您想修改数组以使其增加,即每个元素至少与前一个元素一样大。

每次移动,您都可以将任何元素的值加一。最少需要多少步?

输入:

5

3 2 5 1 7

输出: 5

我对解决方案的尝试:

    输入列表中的元素个数 将列表元素作为字符串输入,并转换为整数列表 创建一个函数,将移动次数存储为非递增元素的差值。例如:在列表[1,2,4,3]中,4大于3,所以它是不增加的,所以我找到了术语之间的差异,并将其添加到移动次数中。 将差值添加到较小的项(即将列表 [1,2,4,3] 变为 [1,2,4,4]) 每当第 i 个项小于第 (i+1) 个列表列表时调用此函数 打印总移动次数

我的代码:

a = input('')
b = list(map(int, a.split(' ')))    # split string into a list of numbers
sum1 = 0
def moves(i):
    global sum1
    for i in range(len(b)-1):
        if b[i] < b[i+1]:
            sum1 += b[i] - b[i+1]
            b[i + 1] += b[i] - b[i+1]
        else:
            moves(i+1)
print(sum1)
moves(0)

实施中有什么问题,我该如何纠正?

【问题讨论】:

它的当前输出是多少? 首先不要覆盖Python的内置变量sum @user202729,它只为所有内容返回 0(将 sum 更改为 sum1 后) 【参考方案1】:

递归是完全错误的方法。您所需要的只是通过列表。并且不要使用全局变量;只返回最终结果。请注意,您的比较是倒过来的。您需要 b[i] > b[i+1],而不是 <.> 的情况

a = input('')
b = list(map(int, a.split()))

def moves(b):
    sum1 = 0
    for i in range(len(b)-1):
        if b[i] > b[i+1]:
            sum1 += b[i] - b[i+1]
            b[i+1] = b[i]
    return sum1

print(moves(b))

【讨论】:

【参考方案2】:

实施中有什么问题,我该如何纠正?

在您的函数中,您不打印任何内容。你打印sum1,然而,在你调用moves(0)之前,但是那个时候sum1的值还是0。 您正在混合递归和迭代:for 循环本身已经涵盖了整个列表,并且(经过一些更正)已经接近迭代解决问题。您仍然需要进行额外的递归调用。由于您已将问题标记为“递归”,我假设您想了解递归解决方案原则上的外观。 您的递归尝试将失败,因为moves(i) 获得了一个参数i,但您没有使用该参数值并立即覆盖for i 循环中的i。因此,每个递归调用都会再次遍历整个列表。 比较b[i] &lt; b[i+1] 是错误的,因为每当b[i] &lt;= b[i+1] 这两个列表元素之间没有任何关系(假设直到b[i] 的所有元素都已经形成一个非递减序列)。 也就是说,一个可行的递归方法可能如下所示:
a = input('')
b = list(map(int, a.split(' ')))    # split string into a list of numbers
sum1 = 0
def moves(i):
    global sum1
    if i < len(b)-1:
        if b[i] > b[i+1]:
            sum1 += b[i] - b[i+1]
            b[i+1] += b[i] - b[i+1]
        moves(i+1)
moves(0)
print(sum1)

此代码有效,但存在一些非功能性质量问题:

应避免使用全局变量。这有充分的理由 - 我建议进行一些研究以了解原因,而不仅仅是接受它作为教条。您可以将它们的使用转化为函数参数和返回值的使用。 存在一些不必要的计算重复:b[i] - b[i+1] 被计算了两次。这种冗余是不利的(搜索代码重复以了解原因)。您可以在此处使用一个临时变量来仅计算一次值,但还有一种更简单的方法:做一些数学运算以找出 b[i+1] += b[i] - b[i+1] 的结果。

【讨论】:

非常感谢。老实说,我只是输入了当时想到的任何内容。下一次,我会更加小心。【参考方案3】:
n=int(input())
lst=list(map(int,input().split()))
iter=0
count=0
for i in range(n-1):
    iter=lst[i]
    ahead=lst[i+1]
    diff=iter-ahead
    if(diff>0):
        count+=diff
        lst[i+1]=iter
print(count)

【讨论】:

以上是关于做一个递增的数组,同时修改数组的主要内容,如果未能解决你的问题,请参考以下文章

返回数组索引并同时递增

php 数组索引值如何重新从0开始递增

在数组中递增 Click Redux 函数

数组674. 最长连续递增序列

数组单调递增中有突变的如何去除

刷题精选:顺时针输出递增数组(螺旋递增升天数组)