gpt4 book ai didi

algorithm - 相似的代码,相同的功能,顺便说一句,无法找出任何区别

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:35:01 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com