今天做题,思路有了,唰唰唰写完,然后样例测试,嗯!?结果不对啊。
function findRepeat(array){
if(array instanceof Array){
let i=0,
len=array.length;
while(i<len){
if(array[i] !== i){
if(array[i] === array[array[i]]){
return array[i];
}
[array[i],array[array[i]]] = [array[array[i]],array[i]];
}else{
i += 1;
}
}
}
return false;
}
苦苦思考半天,思路没问题啊?然后多番调试,原来是解构赋值那里有问题,还是老老实实改成老方法吧。
function findRepeat1(array){
if(array instanceof Array){
let i=0,
len=array.length;
while(i<len){
if(array[i] !== i){
if(array[i] === array[array[i]]){
return array[i];
}
let temp = array[i];
array[i] = array[temp];
array[temp] = temp;
}else{
i += 1;
}
}
}
return false;
}
代码是跑通了,但是不能止于此啊,要知道为啥啊?
想了想,虽然不知道对不对,但还是记录下来比较好。
解构赋值的操作,说白了是“模式匹配”+“赋值”的操作,在赋值的时候,JS是从右往左运算,所以在下面这个结构赋值的语句中,右侧式子先执行,然后左侧式子才赋值。
[array[i],array[array[i]]] = [array[array[i]],array[i]]
例如当i=0时,右侧可以顺利获取array[array[0]]和array[0]的值,但是在左侧赋值时就存在问题了,array[0]的值可以顺利赋值为右侧array[array[0]]的值,而左侧的array[array[0]]首先获取array[0]的值,此时,array[0]的值已经变了,取到的值和理想值不同,于是出现了问题。
上面说的还是比较模糊,举个具体的例子。
在上面这个例子中,右侧array[array[0]]取值为2,array[0]取值为4,左侧赋值时array[0]的值被赋值为2,注意,这里就开始出问题了,array[array[0]]--->array[2],array[0]取到的是改变后的值,所以数组中下标为2的值被修改了。
上面的代码也还是可以用解构赋值的方式,不过要用临时变量保存array[0]的初始值,但还是引入了临时变量,所以和使用老办法区别不大。
function findRepeat1(array){
if(array instanceof Array){
let i=0,
len=array.length;
while(i<len){
if(array[i] !== i){
if(array[i] === array[array[i]]){
return array[i];
}
let temp = array[i];
[array[i],array[temp]] = [array[temp],array[i]];
}else{
i += 1;
}
}
}
return false;
}
上面的代码还有点小问题。。。。用例不是全部通过