LeetCode每日一题|273. 整数转换英文表示

198 阅读2分钟

题目描述

题目链接:leetcode-cn.com/problems/in… image.png

思路分析

已知输入num的范围为[0,23112^{31}-1],2311=21474836472^{31}-1=2147483647为10位数,更具示例可以看出,每三位为一组,即没三个数一个大的单位,这三个数则是个位十位和百位,所以需要预先创建数组来表示每个数字的英文['', 'One ', 'Two ', 'Three ', 'Four ', 'Five ', 'Six ', 'Seven ', 'Eight ', 'Nine '],由于十到二十之间的数字的英文为特殊的单词,所以也需要提前记录['Ten ', 'Eleven ', 'Twelve ', 'Thirteen ', 'Fourteen ', 'Fifteen ', 'Sixteen ', 'Seventeen ', 'Eighteen ', 'Nineteen '],十位的英文['', '', 'Twenty ', 'Thirty ', 'Forty ', 'Fifty ', 'Sixty ', 'Seventy ', 'Eighty ', 'Ninety '],各个大单位的英文['', 'Thousand ', 'Million ', 'Billion ', 'Hundred ']

然后就可以开始对数据进行处理,首先我们先将输入的数每一位取出,即通过除十取余,再每三个进行分组,然后从大的位开始往下处理,这里我先将数组翻转所以可以从下往上处理,在处理时如果最后一组数长度不够三则和其他满三位的组的处理方式会有一点区别所以可以先单独处理,但处理逻辑是相同的。

先判断第三位是否存在或是否等于0,如果存在且不等于0则结果中放入该数和Hundred,然后可以判断第二位是否等于1,如果等于1则需要将第一位作为索引放入十到十九的英文,若不等于1,则只要该位存在可以直接取十位的英文,若是等于0就直接取空字符就可以,再加上个位的英文,如果三个数中有任意一个大于0就需要加上单位数,这里可以直接用数组长度减去当前索引来判断,在循环完全部组数后再去掉尾部的空格因为在定义时给所有单词都加上了空格就是最后的答案

代码

var numberToWords = function (num) {
  if (num == 0) {
    return 'Zero';
  }
  let englishOfNumber09 = ['', 'One ', 'Two ', 'Three ', 'Four ', 'Five ', 'Six ', 'Seven ', 'Eight ', 'Nine '];
  let englishOfNumber1019 = ['Ten ', 'Eleven ', 'Twelve ', 'Thirteen ', 'Fourteen ', 'Fifteen ', 'Sixteen ', 'Seventeen ', 'Eighteen ', 'Nineteen '];
  let englishOfNumber2090 = ['', '', 'Twenty ', 'Thirty ', 'Forty ', 'Fifty ', 'Sixty ', 'Seventy ', 'Eighty ', 'Ninety '];
  let englishOfNumber1000 = ['', 'Thousand ', 'Million ', 'Billion ', 'Hundred '];
  let arr = [];
  let group = [];
  let res = '';
  while (num) {
    group.push(num % 10);
    if (group.length == 3) {
      arr.push([...group]);
      group = [];
    }
    num = Math.floor(num / 10);
  }
  arr.reverse();
  if (group.length) {
    res += group[2] ? englishOfNumber09[group[2]] + 'Hundred ' : '';
    if (group?.[1] < 2) {
      res += englishOfNumber1019[group[0]];
    } else {
      res += group[1] ? englishOfNumber2090[group[1]] : '';
      res += englishOfNumber09[group[0]];
    }
    res += englishOfNumber1000[arr.length];
  }
  for (let i = 0; i < arr.length; i++) {
    let item = arr[i];
    res += item[2] ? englishOfNumber09[item[2]] + 'Hundred ' : '';
    if (item[1] == 1) {
      res += englishOfNumber1019[item[0]];
    } else {
      res += item[1] ? englishOfNumber2090[item[1]] : '';
      res += englishOfNumber09[item[0]];
    }
    if (item[0] + item[1] + item[2]) {
      res += englishOfNumber1000[arr.length - i - 1];
    }
  }
  return res.trim();
};