今天在写算法题(缺失的正数)的时候,发现解构赋值的书写顺序影响了最终得结果,故在此作记录。
var firstMissingPositive = function(nums){
let n=nums.length;
for(let i=0;i<n;i++){
while(nums[i]<n+1 && nums[i]>0 && nums[i]!=nums[nums[i]-1])
[nums[nums[i]-1],nums[i]] = [nums[i],nums[nums[i]-1]]; //正确的代码
[nums[i],nums[nums[i]-1]] = [nums[nums[i]-1],nums[i]]; //错误的写法
}
for(let i=0;i<n;i++){
if(nums[i]!=i+1)return i+1;
}
return n+1;
};
解构赋值的执行流程是:
1.先完全计算右侧表达式的值(一次性求值,不会变)。
2.再按顺序计算左侧每个目标表达式的地址(即索引表达式),然后赋值。
结合上面的代码,我们来分析错误的式子:[nums[i],nums[nums[i]-1]] = [nums[nums[i]-1],nums[i]]
1.假设输入的nums为[3,4,-1,1],i为0时,即[nums[0],nums[nums[0]-1]] = [nums[nums[0]-1],nums[0]]
2.经过第一步解构,错误的式子会被转换成[nums[0],nums[nums[0]-1]] = [-1,3]
3.接下来左边的表达式会从左到右计算,这里会先读取nums[0]的地址并赋值为-1,导致后续nums[nums[0]-1]变成了nums[-2]地址计算出错。
总结:有可能被别的赋值影响的表达式要尽量往左侧放提高优先级。
717

被折叠的 条评论
为什么被折叠?



