我一直在努力改进我的Javascript并且一直在经历Coderbyte的挑战。我似乎无法完美破解的唯一容易的挑战称为“阵列加法1”*。我正在尝试将我的代码与另一位获得完美回复的用户进行比较:
function ArrayAdditionI(arr) {
for (var i = 0; i < arr.length; i++) {
arr[i] = parseInt(arr[i], 10);
}
var max = arr[0];
for (var i = 1; i < arr.length; i++) {
max = Math.max(max, arr[i]);
}
//everything above makes sense
for (var i = 0, l = 1 << arr.length; i < l; i++) {
var s = 0, cnt = 0;
for (var j = 0; j < arr.length; j++) {
if (i & (1 << j)) {
s += arr[j];
cnt++;
}
}
if (cnt > 1 && s == max) {
return true;
}
}
return false;
}
ArrayAdditionI(/* some array*/)
有人可以帮忙解释上面如何使用按位运算符的简单英语解释吗?
[*]
让函数ArrayAdditionI(arr)获取存储的数字数组 在arr中,如果中的任何数字组合,则返回字符串true 数组可以加到等于数组中的最大数字, 否则返回字符串false。例如:如果arr包含[4,6, 23,10,1,3]输出应该返回true,因为4 + 6 + 10 + 3 = 23.数组不会为空,不包含所有相同的元素,并且可能包含负数。
答案 0 :(得分:1)
使用该代码创建元素的所有排列。
说明:
假设我们有4个元素:
0..15
i
的特定位是否设置为i & (1 << j)
PS:cnt > 1
需要检查该总和是否创建多个数字而不是一个
PPS:一次迭代的详细解释。
让我们想象一下当前i = 10
(1010
二进制文件)。
因此,当我们执行嵌套循环时 - 我们将检查是否只设置了第2和第4位,这意味着我们将尝试对数组的第2和第4个元素求和。然后检查它们的总和是否等于最大值。