华为OD机考题之进制转换

309 阅读1分钟

十六进制转换为十进制

  • 0xAAA => 2730
  • 0xAA => 170
  • 0xBAC => 2988
    function able(line) {
      const infos = { A: "10", B: "11", C: "12", D: "13", E: "14", F: "15" };

      const num = line
        .substr(2)
        .split("")
        .reverse()
        .reduce(
          (pre, cur, index) => pre + (infos[cur] || cur) * Math.pow(16, index),
          0
        );
      console.log(num);
      return num;
    }


我知道可以通过parseInt('0xAA');,但其实+0xAANumber(0xAA)也可以,在 Chrome 开发者工具直接就能看到转换后的。

这道题可能造成的困扰:

  • 工作当中不怎么有这种需求,即便是有也有现成的函数。
  • 进制转换的规则忘记了

但算法本身确实不复杂。

我试着通过一下方式生成infos

      const infos = Array(6)
        .fill(1)
        .map((item, index) => String.fromCharCode(65 + index))
        .reduce((pre, cur) => {
          let value = cur.charCodeAt() - 55;
          pre[cur] = value;
          return pre;
        }, {});

成本上来看不如直接写,倒是能稳固下String.fromCharCodecharCodeAt

形参lineconsole.log(num) 是为了配合牛客网答题的。

华为机试题: www.nowcoder.com/exam/oj/ta?…

温馨提示,当你读到:第一行输入一个由字母、数字和空格组成的字符串,第二行输入一个字符(保证该字符不为空格)。这个第二行要再一次使用await readline() 读取

比如:计算某字符出现次数

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    while(line = await readline()){
       const str = line.toLowerCase();
       const word = (await readline()).toLowerCase();
       let count = 0;
       [...str].forEach((item)=>{
        if(item == word){
            count++
        }
       })
       console.log(count);
    }
}()