做一个递增的数组,同时修改数组
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] < b[i+1]
是错误的,因为每当b[i] <= 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)
【讨论】:
以上是关于做一个递增的数组,同时修改数组的主要内容,如果未能解决你的问题,请参考以下文章