【问题标题】:Find original place of an element in array after deleting other elements删除其他元素后在数组中查找元素的原始位置
【发布时间】:2020-09-29 23:25:40
【问题描述】:

我有一个数字列表。假设它是在 40 范围内随机选择的数字。

我有一个 for 循环,它在每次迭代中选择一个索引。在循环中完成一轮后,我将我选择的索引保存在一个列表中,然后将其从原始列表中删除(因此每次迭代后,都会从原始列表中删除一个元素)。

perm = random.sample(range(1, 40), 30) 
for i in range(7):
   index = random.randrange(len(perm))
   perm.pop(index)

最后,我有一个索引列表,显示了我在每次迭代中删除的索引的编号,例如l = [5, 15, 6, 7, 11, 3, 8]。有没有一种简单的方法可以获取这些索引的原始位置? (例如我先删除了5,所以当我选择15时它实际上在原始数组中的第16位,我想找到所有索引的原始位置)

我尝试了类似这样的简单方法:

for i in range(len(l)):
    for j in range(i):
        if l[i] >= l[j]:
            l[i] += 1

但这似乎不太对劲。关于如何使其仅使用一个循环的任何想法?

【问题讨论】:

  • 您需要保留一份原始列表的副本以及您要从列表中删除的值的列表。
  • @Carcigenicate 这是我正在处理的一个更大问题的子问题,为此,我需要在每次迭代后删除我选择的索引。
  • @pavel 我需要索引,并且我的原始问题中可能存在重复值。所以,很遗憾我做不到。

标签: python list algorithm


【解决方案1】:
l = [5, 15, 6, 7, 11, 3, 8]

copy = l[:]
for i in range(len(l)):
    for j in range(i):
        l[i] += 1 if copy[i] >= copy[j] else 0

print(l)  # [5, 16, 7, 9, 14, 3, 12]

就像@pavel 所说,您需要制作一份工作副本。那么你的想法就行了。

【讨论】:

  • 现在这段代码有二次运行时间。我很确定您可以先对值进行排序(n log n),然后对每个值进行二进制搜索(同样是 n log n)。这将导致 n log n 运行时。
猜你喜欢
  • 2022-07-07
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多