减少数组元素

时间:2019-05-12 11:45:45

标签: arrays python-3.x list vector c++14

给出一个数组或数字列表
例如
[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]

0 个答案:

没有答案