0

我正在尝试设置循环排序,其中数字范围是提前知道的

def cyclic_sort(nums):
  # TODO: Write your code here
  i = 0

  while i < len(nums):
    while nums[i] - 1 != i:
        nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
    i += 1

  return nums


print(cyclic_sort([2, 1, 3]))

然而,当我重构到下面的代码运行时,代码只是挂起

def cyclic_sort(nums):
  # TODO: Write your code here
  i = 0

  while i < len(nums):
    while nums[i] - 1 != i:
        other = nums[i] - 1
        nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
    i += 1

  return nums


print(cyclic_sort([2, 1, 3]))

有人可以帮助我了解发生了什么吗?

4

1 回答 1

1

nums[i] 首先被重新分配,所以当 nums[nums[i] - 1] = ... 被评估时,它采用 nums[i] 的新值,在这种情况下为 1。
所以你得到 nums[在您的示例中,0] = 1,然后 nums[1-1] = 2。

您正在将当前元素的值设置为要交换的新值,然后将交换元素值所在位置的元素设置为当前值。

您的代码相当于:

        x, y = nums[nums[i] - 1], nums[i]
        nums[i] = x                 #nums[i] is set to value of element you want to swap
        nums[nums[i] - 1] = y       #nums[(value at swapped element) - 1] = (current elements original value)

您也不需要 while 循环,它不会做任何有用的事情,因为您已经根据值知道数字应该在哪个位置,因此您只需要在每个位置检查一次。

交换赋值顺序,因为 nums[i] 不会受到改变 nums[nums[i] - 1] 值的影响。

def cyclic_sort(nums):
  # TODO: Write your code here
  i = 0

  while i < len(nums):
    if nums[i] - 1 != i:
        nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
    i += 1

  return nums


print(cyclic_sort([2, 1, 3]))
于 2020-07-20T01:38:54.260 回答