二十六进制

分类:JavaScript     发布时间:2021-04-07     最后更新:2021-04-07     浏览数:2138
一个简单的进制转换算法

今天下班后,朋友在微信发了一个问题给我:

给定两个字符串(字符串仅包含字母),计算他们之间相差的“距离”,如 a 与 c 之间相差的“距离”是 2; aa 与 bc 之间相差的“距离”是 28; aa 与 abc 之间相差的“距离”是 704。请编程实现。

说真的,看到这题目,我是一头雾水,后来问了一下大神,他说这是二十六进制,瞬间迷雾散开,然后开始思考,怎样解题。 公式:

// 先来看看我们熟悉的十进制:6543:6 * 10^3 + 5 * 10^2 + 4 * 10^1 + 3 * 10^0,其中 10 就是十进制中的 10

// 假设映射 a -> 1, b -> 2, c -> 3...z->26

// 那么来看看二十六进制:a -> 1, c -> 3, 它们的距离 c - a = 3 -1 = 2;
// aa -> 1 * 26^1 + 1 * 26^0 -> 27
// bc -> 2 * 26^1 + 3 * 26^0 -> 55
// 它们的距离是 bc - aa = 55 - 27 = 28;

const a = 'aa';
const b = 'abc';

// [a...z] -> ASCII 码点 -> [97, 122]
// -> 字符的码点 - 96 得到 [a...z] -> [1...27]

let result = letter2Number(b) - letter2Number(a);

console.log(`distance is ${result}`);

function letter2Number(str) {
  let total = 0;
  const len = str.length;
  for (let i = len - 1; i >= 0; i--) {
    const letter = str[len - i - 1];
    const value = letter.charCodeAt(0) - 96;
    total += (value)* Math.pow(26, i);
    console.log(`letter is ${letter}, ${value} * 26^${i}`);
  }
  console.log(`str is ${str}, num is ${total}`);
  return total;
}
上一篇: 我的微信小程序项目 下一篇: Python 自动生成二维码并填充到 Excel 单元格