JavaScript数组找唯一数:异或解法是否为最优方案?求更优思路
关于异或查找数组唯一数的JS实现优化分析
嘿,这个问题问得很到位!咱们先拆解下你的实现,再聊聊优化方向~
首先得明确:用异或运算查找数组中唯一出现一次的元素(其余元素出现两次)的思路本身就是最优方案——它的时间复杂度是O(n)(必须遍历所有元素一次,没法再快了),空间复杂度是O(1)(只用常数级额外空间),这已经是理论上的最优边界了。
不过你的代码还有可以简化和优化的地方,咱们来看看:
你的代码可以优化的点
- 多余的
if判断:你单独处理了i===0的情况,但异或运算有个性质是0 ^ x = x,完全可以直接初始化结果为0,然后统一遍历所有元素进行异或,没必要拆分逻辑。 - 修改原数组:你直接修改了输入数组的
nums[0],这会带来不必要的副作用(污染原数组),用单独的变量存储结果会更合理。 - 变量声明:使用
var会有变量提升的问题,现代JS更推荐用let/const来声明变量。
优化后的代码
var singleNumber = function(nums) { let result = 0; for (const num of nums) { result ^= num; } return result; };
优化点说明
- 用
let声明result,避免var的变量提升问题;用const声明循环里的num,符合变量不可变的场景。 - 用
for...of循环替代传统的索引循环,代码更简洁易读,不用手动维护索引i。 - 去掉了多余的分支判断,逻辑更紧凑,同时不修改原数组,避免副作用。
- 本质逻辑和你的代码完全一致,都是利用异或运算
a ^ a = 0、a ^ 0 = a的性质,把所有元素异或后,重复的元素会抵消为0,最终剩下的就是唯一的那个数。
总结一下:你的核心思路是完全正确且最优的,只是代码可以写得更简洁、更符合现代JS规范~
内容的提问来源于stack exchange,提问作者Jainil Chauhan
相关产品推荐
相关产品推荐

