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 位数字转换英文表示上和前后空格处理重复问题,遇到很多测试用例没过都是空格多一个的问题。这道题有耐心和细心就可以做出来,没有什么技巧性,官方的题解也是比较中肯的技巧
优质题解
- https://leetcode.cn/problems/integer-to-english-words/solution/zheng-shu-zhuan-huan-ying-wen-biao-shi-b-ivik/
- https://leetcode.cn/problems/integer-to-english-words/solution/gong-shui-san-xie-zi-fu-chuan-da-mo-ni-b-0my6/
- https://leetcode.cn/problems/integer-to-english-words/solution/dai-ma-jian-ji-yi-chong-huan-bu-cuo-de-j-jzf6/
- https://leetcode.cn/problems/integer-to-english-words/solution/pythonjavajavascript-mo-ni-by-himymben-pk8r/