algorithm - 类似的代码,相同的功能,不知道它们有什么区别
问题描述
你能检查一下上面的链接吗?
我看不懂代码
而 (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循环必须同时具备这两个条件呢?或者我们可以只使用其中之一?
解决方案
我同意第二个条件是不必要的。事实上,我认为它不必要地使代码混乱。
在英语中,代码本质上是“如果 [something] and (x != y), then swap x and y”。所有 "x != y" 检查所做的就是防止将 x 与(等于)自身交换。但这是一个无操作,因此可以在不改变行为或 O(n) 性能的情况下删除检查。
删除该检查可以更容易地阅读算法:“对于每个插槽 i,当插槽 i 处的项目错误时,将其交换到它所属的位置。”
[更新]
哎呀!我刚刚意识到检查的重点......它可以防止潜在的无限循环,你不断地来回交换相同的值。(因为条件实际上是“while”,而不是“if”。)
所以提出的算法是正确的。
推荐阅读
- swift - 这个 Swift TimeZone 是另一个时区假设中日期的缩写有什么问题?
- android - ARCore – Android 模拟器上的“此设备不支持 AR”
- java - 对象调用错误
- java - 使用 MyBatis、H2 和 Oracle 程序进行集成测试
- python-3.x - 如何在远程进程之间使用 Python3.9.2 multiprocessing.SyncManager?
- discord - 所以不和谐机器人状态.....我该如何设置它们?
- wordpress - 登录到 Wordpress Elementor 的外部站点
- java - 最大可能的数组需要多少内存?
- express - 如何控制台注销我从特快专递请求中返回的内容
- html - nav ul 中的 Href 没有响应