【发布时间】:2019-03-08 00:27:16
【问题描述】:
我目前正在学习 Javascript 算法。以下是我目前尝试学习/理解的算法。
function same(arr1, arr2){
if(arr1.length !== arr2.length){
return false;
}
let frequencyCounter1 = {}
let frequencyCounter2 = {}
for(let val of arr1){
frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1
console.log(frequencyCounter1);
}
for(let val of arr2){
frequencyCounter2[val] = (frequencyCounter2[val] || 0) +1
}
for(let key in frequencyCounter1){
if(!(key ** 2 in frequencyCounter2)){
return false
}
if(frequencyCounter2[key ** 2] !== frequencyCounter1[key]){
return false
}
}
return true
}
same([1,2,3,2,5], [9,1,4,4,11])
我理解代码,除了 1 行。
frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1
那么这个算法的作用是尝试比较 2 个数组。如果数组b等于数组a中每个数的平方,则返回true,否则返回false。
所以在这个例子中,它会返回 false
如果我执行 [1,2,3,4,5] [1,4,9,16,25],它将返回 true
我知道这条线的作用:
frequencyCounter1[val] = (frequencyCounter1[val] || 0) +1
它是一个键值对,所以说第一次迭代时,它以1为键,然后以(frequencyCounter1[val] || 0)+1为值,现在这个值表示a的个数一个数字出现在数组中的次数,所以如果 1 出现 10 次,它将有一个键值对 1:10
这个我理解的很清楚,就是想知道这个语句是怎么评价的,幕后发生了什么?
(frequencyCounter1[val] || 0) +1
【问题讨论】:
-
JS 中有一些 false-y 值:
false、0、undefined、null、NaN和''(空字符串)。||如果不是 false-y,则返回第一个值;如果第一个是 false-y,则返回第二个值。所以当frequencyCounter[val]是undefined时,这个表达式产生0。如果不是,它产生那个值。
标签: javascript