十六进制转换为十进制
- 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');,但其实+0xAA、Number(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.fromCharCode 和 charCodeAt。
形参line 和 console.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);
}
}()