首页 > 解决方案 > 类似的代码,相同的功能,不知道它们有什么区别

问题描述

https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/discuss/93007/simple-java-in-place-sort-solution

你能检查一下上面的链接吗?

我看不懂代码

而 (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]

最终也是一样的,只是为了证明index值=index+1。

但是为什么while循环必须同时具备这两个条件呢?或者我们可以只使用其中之一?

标签: algorithm

解决方案


我同意第二个条件是不必要的。事实上,我认为它不必要地使代码混乱。

在英语中,代码本质上是“如果 [something] and (x != y), then swap x and y”。所有 "x != y" 检查所做的就是防止将 x 与(等于)自身交换。但这是一个无操作,因此可以在不改变行为或 O(n) 性能的情况下删除检查。

删除该检查可以更容易地阅读算法:“对于每个插槽 i,当插槽 i 处的项目错误时,将其交换到它所属的位置。”

[更新]

哎呀!我刚刚意识到检查的重点......它可以防止潜在的无限循环,你不断地来回交换相同的值。(因为条件实际上是“while”,而不是“if”。)

所以提出的算法是正确的。


推荐阅读