【问题标题】:Is reversing part of python list in place正在反转python列表的一部分
【发布时间】:2017-11-12 16:53:02
【问题描述】:

按以下方式反转部分数组是否会创建从 i 到 j 的数组副本?

a[i:j] = a[i:j][::-1] # is this in place? Does this operation require O(j-i) space

下面的代码不会占用额外的空间吗?

a[i:j] = reversed(a[i,j])

除了下面的代码之外,还有其他方法可以用 O(1) 空间反转列表的一部分吗?

for k in range(i, i + (j-i + 1)//2):
  arr[k], arr[j-k] = arr[j-k], arr[k]

【问题讨论】:

  • 你可以在没有临时位置的情况下在 Python 中交换东西,例如arr[k], arr[j-k] = arr[j-k], arr[k]

标签: python list reverse


【解决方案1】:

有点。 a 已就地修改,但 a[i:j] 会创建一个新的列表对象,就像将 [::-1] 应用于 a[i:j] 一样。

b = a[i:j]  # new list object
b = b[::-1] # another new list object
a[i:j] = b  # modifies a in place

【讨论】:

  • 所以你是说它需要额外的 O(j-i) 空间?
  • 是的;使用更少空间的唯一方法是在循环中一次交换一对元素,使用 O(1) 空间(即,独立于 ij)。
  • 如果反向方法可以在列表中具有“开始”和“结束”位置的参数 - 即 your_list.reverse() - ,则可能有一种方法可以反转列表的一部分 - 但是到今天为止,还没有这样的实现
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2020-08-13
  • 2014-10-07
  • 2020-04-03
  • 2014-03-19
相关资源
最近更新 更多