给出一个数组或数字列表
例如
[1,4,6,7,9,10,11,12,13,15]
我们必须逐步减小数组的值,直到给定的步数为止。 仅当当前元素大于最后一个元素+ 1时,才可以减少数组元素 即
if (arr[i]>arr[i-1]+1)
arr[i] -= 1
我们必须进行此迭代,直到达到所需的步骤数或数组元素变得连续为止。
如果数组值减小到其索引,则我们不会进一步减小。
例如
[1,4,6,7,9,10,11,12,13,15]
步骤1
[1、3、5、7、8、10、11、12、13、14]
(我们没有减少1,因为它的值与它的索引相同,所以我们将4减少到3,因为最后一个元素是1,4> 1 + 1,与6相似。但是对于7,因为条件7> 6 + 1失败因此我们不会减少它。)
第2步
[1、2、4、6、8、10、11、12、13、14]
第三步
[1、2、3、5、7、9、11、12、13、14]
步骤4
[1、2、3、4、6、8、10、12、13、14]
步骤5
[1、2、3、4、5、7、9、11、13、14]
步骤6
[1、2、3、4、5、6、8、10、12、14]
步骤7
[1、2、3、4、5、6、7、9、11、13]
步骤8
[1、2、3、4、5、6、7、8、10、12]
步骤9
[1、2、3、4、5、6、7、8、9、11]
步骤10
[1、2、3、4、5、6、7、8、9、10]
要求我在第K个步骤返回数组。 如果当数组元素变为连续时K> step,则返回连续的。 在上面的示例中,如果K = 20,我们将返回Step-10的数组。
我写了一个python脚本,但不适用于测试数据。这花费了太多时间。有人可以为这个问题提供更优化的解决方案。
def reduce(arr):
crr = []
for i in range(1, len(arr)+1):
if arr[i-1]!=i and arr[i-2]!=arr[i-1]-1:
crr.append(arr[i-1]-1)
else:
crr.append(arr[i-1])
return crr
brr = [int(i) for i in input().split()]
k = int(input())
goal = list(range(len(brr)))
while k!=0 and brr!=goal:
k -= 1
brr = reduce(brr)
print(brr)
输入:
arr = 1 4 6 7 9 10 11 12 13 15
k = 7
我的代码的输出:
[1、2、3、4、5、6、7、9、11、13]