【问题标题】:Quiz: Convert into binary numbers, overlay arrays in JavaScript测验:转换成二进制数,在 JavaScript 中覆盖数组
【发布时间】:2018-02-25 21:37:36
【问题描述】:

我已经用 JavaScript 解决了以下测验,并将测验和我的解决方案附在下面。 解决问题时我感觉不对,因为我知道我错过了如何调用函数! 任何人都可以使用调用函数的方法帮助我以更简单的方式重写代码吗? 或者任何一种最简单的方法都是受欢迎的!

测验:

给定三个输入:两个长度相同的数组,包含十进制数及其长度数, 将两个数组中的数字转换为二进制数,如下所示:

01001
10100
11100
10010
01011

11110
00001
10101
10001
11100

然后,通过将两个数组重叠在一起来组合两个数组,创建一个新数组,每个数组都有 1, (1覆盖0),像这样:

11111
10101
11101
10011
11111

作为最后一步,在 (# = 1, space = 0) 的条件下,将此数组转换为具有#s 和空格的格式 最后,你应该得到它作为输出 >

[ '#####', '# # #', '### #', '#  ##', '#####' ]

我的解决方案:

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 arrays function data-conversion binary-operators


    【解决方案1】:

    这里有一个更简单的解决方案:)

    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]));

    【讨论】:

    • 为了简单起见,我赞成您的解决方案,但我鼓励您将 function solution() {...} 完全封闭,这意味着您应该在函数内部进行字符串替换。
    【解决方案2】:

    所谓的“1 覆盖 0”是二元运算符。 | operator (pronounce 'OR') 采用 2 个十进制数字的二进制表示,然后比较每个二进制数字(= 每个位),如果其中一个或两个位等于 1,则产生 1。

    您询问的是一种“调用”或重用用于将 arr1 转换为也转换 arr2 的函数的方法。但实际上并不需要这两种转换。使用 |运算符不需要转换十进制数字,因为无论如何这都是计算机内部使用的。

    你可以试试这个……

    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 数组发生了很多事情。这就是为什么我一个接一个地写了.mapcalls。这称为方法链。第一个 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 数组中相同的元素

    【讨论】:

      【解决方案3】:

      在 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:
      // ["#####", "# # #", "### #", "#  ##", "#####"]

      【讨论】:

        猜你喜欢
        • 2021-11-04
        • 2017-01-26
        • 2010-12-06
        • 1970-01-01
        • 2016-07-08
        • 1970-01-01
        • 2020-08-06
        • 2013-02-10
        • 2013-11-08
        相关资源
        最近更新 更多