Skip to content

273. 整数转换英文表示

解题过程

INFO

题目链接 将非负整数 num 转换为其对应的英文表示。

javascript
/**
 * @link https://leetcode.cn/problems/integer-to-english-words/
 * @title 273. 整数转换英文表示
 * @description 将非负整数 num 转换为其对应的英文表示
 * @param {number} num
 * @return {string}
 */
// 解法一
// 思路:通过映射表列出个位数、十几位数、整数的表示方法,然后将数字按照金额 3 位分隔开来换算 3 位数字的转换英文字符即可
// 难点:3 位数字的换算和前后空格处理,空格处理部分花了挺长时间测试用例错误问题
var numberToWords = function (num) {
  // 个位数表示
  const nums = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine']
  // 十几位数的表示
  const tenNums = ['', 'Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen']
  // 整数的表示
  const intNums = ['', 'Ten', 'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety']

  if (num === 0) {
    return nums[0]
  }

  // 千位下 3 位数换算
  const num1 = num % 1000
  num = Math.floor(num / 1000)
  // 百万位下 3 位换算
  const num2 = num % 1000
  num = Math.floor(num / 1000)
  // 十亿位下 3 位换算
  const num3 = num % 1000
  num = Math.floor(num / 1000)
  // 十亿位上,3 位换算
  const num4 = num

  const calcUnit = (newNum) => {
    let numStr = ''
    // 百位数
    const num100 = Math.floor(newNum / 100)
    // 十位数
    const num10 = Math.floor(newNum / 10) % 10
    // 个位数
    const num1 = newNum % 10

    if (num100 !== 0) {
      numStr = nums[num100] + ' ' + 'Hundred'
    }

    if (num10 === 0 && num1 !== 0) {
      numStr += ' ' + nums[num1]
    } else if (num10 === 1) {
      if (num1 === 0) {
        numStr += ' ' + intNums[num10]
      } else {
        numStr += ' ' + tenNums[num1]
      }
    } else {
      if (num1 === 0) {
        numStr += ' ' + intNums[num10]
      } else {
        numStr += ' ' + intNums[num10] + ' ' + nums[num1]
      }
    }

    return numStr.trim()
  }

  let res = ''
  if (num4 !== 0) {
    res = calcUnit(num4) + ' Billion '
  }

  if (num3 !== 0) {
    res += calcUnit(num3) + ' Million '
  }

  if (num2 !== 0) {
    res += calcUnit(num2) + ' Thousand '
  }

  if (num1 !== 0) {
    res += calcUnit(num1)
  }

  return res.trim()
};

// const result = numberToWords(123) // One Hundred Twenty Three
// const result = numberToWords(10) // Ten
const result = numberToWords(12345) // Twelve Thousand Three Hundred Forty Five
// const result = numberToWords(1234567) // One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven
// const result = numberToWords(1001) // "One Thousand One"
console.log(result)

解题感受

题目一句话,要做的就是多,不然难度也不会困难级别了。画一个小时做出来,很多时间花在计算 3 位数字转换英文表示上和前后空格处理重复问题,遇到很多测试用例没过都是空格多一个的问题。这道题有耐心和细心就可以做出来,没有什么技巧性,官方的题解也是比较中肯的技巧

优质题解