您可以查看上面的链接吗?
我看不懂代码
while (nums[i] != i + 1 && nums[i] != nums[nums[i] - 1])
这两者有什么区别?
1) nums[i] != i+1
2) nums[i] != nums[nums[i]-1]
例如
index 0 : 1
index 1 : 2
index 2 : 3
然后,第一个只需使用 index
我们就可以检查
index+1
是否为值。
和第二个,
nums[0] = nums[nums[i]-1]
nums[0] = nums[nums[0]-1]
nums[0] = nums[1-1]
nums[0] = nums[0]
最终也是同一件事,只是为了证明这一点 索引值=索引+1。
但是为什么 while 循环必须同时具备两个条件呢? 或者我们可以只使用其中之一?
最佳答案
我同意第二个条件是不必要的。事实上,我认为它不必要地使代码变得困惑。
在英语中,代码本质上是“如果 [something] 和 (x != y),则交换 x 和 y”。所有“x!= y”检查所做的就是防止将 x 与(等于)本身交换。但这是一个无操作,因此可以在不改变行为或 O(n) 性能的情况下删除该检查。
删除该检查可以更轻松地阅读算法:“对于每个插槽 i,当插槽 i 的项目错误时,将其交换到它所属的位置。”
[更新]
哎呀!我刚刚意识到检查的意义...它可以防止潜在的无限循环,即您不断来回交换相同的值。 (因为条件实际上是一个“while”,而不是“if”。)
所以所提出的算法是正确的。
关于algorithm - 相似的代码,相同的功能,无法弄清楚它们之间有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56572789/