algorithm - 相似的代码,相同的功能,无法弄清楚它们之间有什么区别

标签 algorithm

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

您可以查看上面的链接吗?

我看不懂代码

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/

相关文章:

c# - 二维房间的程序生成

C# 字符串排列

c# - 从相机设备获取数字

保持更改数组排序顺序的算法

javascript - 将元素与总和列表匹配

c++ - 如何使用递归反转链表?

mysql - 是否有可能更快地获得查询?

python - 排列代码不能给出正确的结果

c# - 图问题的算法

algorithm - 三个正数 x、y、z 的组合,使得 x + y、x - y、y + z、y - z、x + z 和 x - z 是完全平方数