小测验:转换成二进制数,覆盖JavaScript中的数组
Quiz: Convert into binary numbers, overlay arrays in JavaScript
我已经解决了 JavaScript 中的以下测验,并在下面附上了测验和我的解决方案。
我觉得解决问题不对,因为我知道我错过了如何回忆功能!
谁能帮我用调用函数的方法把代码重写得更简单些?
或任何一种最简单的方法都是受欢迎的!
测验:
给定三个输入:两个长度相同的数组,包含十进制数及其长度数,
将两个数组中的数字转换成二进制数,像这样:
01001
10100
11100
10010
01011
11110
00001
10101
10001
11100
然后,通过一个重叠另一个来组合两个数组,从每个数组中创建一个具有 1 的新数组,
(1 覆盖 0),像这样:
11111
10101
11101
10011
11111
作为最后一步,在(# = 1, space = 0)的条件下,将此数组转换为具有#s-和spaces的格式
最后,你应该得到这个作为输出 >
[ '#####', '# # #', '### #', '# ##', '#####' ]
我的解决方案:
function solution(n, arr1, arr2) {
var convArr1 = arr1.map(function(numten) {
return numten.toString(2);
})
var convArr2 = arr2.map(function(numten) {
return numten.toString(2);
})
var newArr1 = convArr1.map(function(binNum) {
if (binNum.length != n) {
let zero = '0';
for (let i = 1; i < n - binNum.length; i++) {
zero = zero + 0;
}
binNum = zero + binNum;
return binNum;
} else {
return binNum;
}
})
var newArr2 = convArr2.map(function(biNum) {
if (biNum.length != n) {
var zero = '0';
for (let i = 1; i < n - biNum.length; i++) {
zero = zero + '0';
}
biNum = zero + biNum;
return biNum;
} else {
return biNum;
}
})
// console.log(newArr1, newArr2);
var answer = ["", "", "", "", ""];
var element = "";
function compare(a, b) {
for (var i = 0; i < a.length; i++) {
if (a[i] === '1' || b[i] === '1') {
answer[i] = answer[i] + '#';
} else {
answer[i] = answer[i] + ' ';
}
}
}
var compareArr = [];
for (var i = 0; i < n; i++) {
var numInArr1 = newArr1[i];
var numInArr2 = newArr2[i];
compare(numInArr1, numInArr2);
}
return answer;
}
console.log(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]));
在JavaScript中,我们可以对十进制数进行位运算,然后通过.toString(2)
函数将它们解析回二进制:
function solution(n, arr1, arr2) {
return Array.from(arr1.keys())
.map(i => {
const num = arr1[i] | arr2[i];
const padded = "0".repeat(n) + num.toString(2);
const binary = padded.substr(padded.length - n);
return binary.split("")
.map(c => c === "0" ? " " : "#")
.join("");
});
}
console.log(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]));
// Out:
// ["#####", "# # #", "### #", "# ##", "#####"]
这里有一个更简单的问题解决方案:)
function solution(num, inputOne, inputTwo) {
return Array(num).fill(0).map(function(un, index) {
return (inputOne[index] | inputTwo[index]).toString(2).replace(/0/g, ' ').replace(/1/g, '#');
});
}
console.log(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]));
你所说的'1 overlays 0'是一个二元运算符。 | operator (pronounce 'OR') 采用 2 个十进制数的二进制表示,然后比较每个二进制数字(= 每个位),如果其中一位或两位等于 1,则生成 1。
您问的是 'recall' 或重用用于转换 arr1 的函数也可以转换 arr2 的方法。但这两种转换都不是真正需要的。使用 | operator 不需要十进制数的转换,因为这是计算机内部使用的。
你可以试试这个...
function solution (n, arr1, arr2) {
result = arr1.map(function (element, index) {
// take the element and the relative element of the other array
// and use the binary OR operator
return element | arr2[index];
}).map(function (element) {
// make a string of the required number of spaces ...
// and add our binary pattern of replacements for 1's and 0's
binary = " ".repeat(n) + element.toString(2).replace(/1/g,'#').replace(/0/g,' ');
// truncate to return only the last n bits
return binary.slice(-n);
});
return result;
}
console.log(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]));
同一个 arr1
数组发生了很多事情。这就是为什么我一个接一个地编写 .map
调用。这称为 方法链接 。第一个 map 方法采用 arr1
然后生成一个新数组。当然那个数组还有一个我们可以调用的 .map
方法。第一个映射用于组合 arr1 和 arr2。第二个 map 调用用于将结果转换为我们的 #
和 SPACE
.
模式的数组
在第一次映射调用中,我们的回调函数采用了一个额外的参数:
arr1.map(function (element, index) {
// take the element and the relative element of the other array
// and use the binary OR operator
return element | arr2[index];
})
我们需要映射的每个元素的索引号,因为我们需要 arr2
数组中的相同元素。
我已经解决了 JavaScript 中的以下测验,并在下面附上了测验和我的解决方案。 我觉得解决问题不对,因为我知道我错过了如何回忆功能! 谁能帮我用调用函数的方法把代码重写得更简单些? 或任何一种最简单的方法都是受欢迎的!
测验:
给定三个输入:两个长度相同的数组,包含十进制数及其长度数, 将两个数组中的数字转换成二进制数,像这样:
01001
10100
11100
10010
01011
11110
00001
10101
10001
11100
然后,通过一个重叠另一个来组合两个数组,从每个数组中创建一个具有 1 的新数组, (1 覆盖 0),像这样:
11111
10101
11101
10011
11111
作为最后一步,在(# = 1, space = 0)的条件下,将此数组转换为具有#s-和spaces的格式 最后,你应该得到这个作为输出 >
[ '#####', '# # #', '### #', '# ##', '#####' ]
我的解决方案:
function solution(n, arr1, arr2) {
var convArr1 = arr1.map(function(numten) {
return numten.toString(2);
})
var convArr2 = arr2.map(function(numten) {
return numten.toString(2);
})
var newArr1 = convArr1.map(function(binNum) {
if (binNum.length != n) {
let zero = '0';
for (let i = 1; i < n - binNum.length; i++) {
zero = zero + 0;
}
binNum = zero + binNum;
return binNum;
} else {
return binNum;
}
})
var newArr2 = convArr2.map(function(biNum) {
if (biNum.length != n) {
var zero = '0';
for (let i = 1; i < n - biNum.length; i++) {
zero = zero + '0';
}
biNum = zero + biNum;
return biNum;
} else {
return biNum;
}
})
// console.log(newArr1, newArr2);
var answer = ["", "", "", "", ""];
var element = "";
function compare(a, b) {
for (var i = 0; i < a.length; i++) {
if (a[i] === '1' || b[i] === '1') {
answer[i] = answer[i] + '#';
} else {
answer[i] = answer[i] + ' ';
}
}
}
var compareArr = [];
for (var i = 0; i < n; i++) {
var numInArr1 = newArr1[i];
var numInArr2 = newArr2[i];
compare(numInArr1, numInArr2);
}
return answer;
}
console.log(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]));
在JavaScript中,我们可以对十进制数进行位运算,然后通过.toString(2)
函数将它们解析回二进制:
function solution(n, arr1, arr2) {
return Array.from(arr1.keys())
.map(i => {
const num = arr1[i] | arr2[i];
const padded = "0".repeat(n) + num.toString(2);
const binary = padded.substr(padded.length - n);
return binary.split("")
.map(c => c === "0" ? " " : "#")
.join("");
});
}
console.log(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]));
// Out:
// ["#####", "# # #", "### #", "# ##", "#####"]
这里有一个更简单的问题解决方案:)
function solution(num, inputOne, inputTwo) {
return Array(num).fill(0).map(function(un, index) {
return (inputOne[index] | inputTwo[index]).toString(2).replace(/0/g, ' ').replace(/1/g, '#');
});
}
console.log(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]));
你所说的'1 overlays 0'是一个二元运算符。 | operator (pronounce 'OR') 采用 2 个十进制数的二进制表示,然后比较每个二进制数字(= 每个位),如果其中一位或两位等于 1,则生成 1。
您问的是 'recall' 或重用用于转换 arr1 的函数也可以转换 arr2 的方法。但这两种转换都不是真正需要的。使用 | operator 不需要十进制数的转换,因为这是计算机内部使用的。
你可以试试这个...
function solution (n, arr1, arr2) {
result = arr1.map(function (element, index) {
// take the element and the relative element of the other array
// and use the binary OR operator
return element | arr2[index];
}).map(function (element) {
// make a string of the required number of spaces ...
// and add our binary pattern of replacements for 1's and 0's
binary = " ".repeat(n) + element.toString(2).replace(/1/g,'#').replace(/0/g,' ');
// truncate to return only the last n bits
return binary.slice(-n);
});
return result;
}
console.log(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]));
同一个 arr1
数组发生了很多事情。这就是为什么我一个接一个地编写 .map
调用。这称为 方法链接 。第一个 map 方法采用 arr1
然后生成一个新数组。当然那个数组还有一个我们可以调用的 .map
方法。第一个映射用于组合 arr1 和 arr2。第二个 map 调用用于将结果转换为我们的 #
和 SPACE
.
在第一次映射调用中,我们的回调函数采用了一个额外的参数:
arr1.map(function (element, index) {
// take the element and the relative element of the other array
// and use the binary OR operator
return element | arr2[index];
})
我们需要映射的每个元素的索引号,因为我们需要 arr2
数组中的相同元素。