Go: 如何交换 slice 中的两个元素?

这两段代码的结果为什么不一样:

package main
import (
        "fmt"
)

func main() {
        test := []int{2, 1, 1}
        fmt.Println(findDuplicate(test))
}
func findDuplicate(nums []int) int {
    for i := 0; i < len(nums); i++ {
        if nums[i] != i+1 {
            if nums[i] == nums[nums[i]-1] {
                return nums[i]
            }
            /*
            tmp := nums[i]
            nums[i] = nums[nums[i]-1]
            nums[nums[i]-1] = tmp
            */
             nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
        }
    }
    return 0
}

以上代码输出的结果是 1

package main
import (
        "fmt"
)

func main() {
        test := []int{2, 1, 1}
        fmt.Println(findDuplicate(test))
}
func findDuplicate(nums []int) int {
    for i := 0; i < len(nums); i++ {
        if nums[i] != i+1 {
            if nums[i] == nums[nums[i]-1] {
                return nums[i]
            }
          
            tmp := nums[i]
            nums[i] = nums[nums[i]-1]
            nums[nums[i]-1] = tmp
          
            //nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
        }
    }
    return 0
}

以上代码输出的结果是 0

我的 Go 版本是 Go 1.8

阅读 6.9k
1 个回答

2种交换方式都没错,问题是第一种情况在交换的过程中nums[i]的值发生了变化

tmp := nums[i]
nums[i] = nums[nums[i]-1] //此处nums[i]的值改变了
nums[nums[i]-1] = tmp //下标nums[i]-1已经不是你想要的值了

改为下面这种就没问题了:

tmp := nums[nums[i]-1]
nums[nums[i]-1] = nums[i]
nums[i]  = tmp
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题