https://leetcode.com/problems/integer-to-english-words/
这题记得是《c 和指针》里的一道习题,三年前花了一晚上做过。现在花了大概40 分钟。
我的思路是三位三位的处理。三位与三位之间通过简单的用量级(Thousand, Million, Billion)拼接。特殊处理两位数的情况:小于20 和大于20 两种情况。
1)小于20 的时候是:'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine', 'Ten','Eleven', 'Twelve', 'Thirteen', 'Fourteen', 'Fifteen', 'Sixteen', 'Seventeen', 'Eighteen', 'Nineteen'
2)大于20 的时候,就是十位数的量级加上个位数,十位数的量级是:'Twenty', 'Thirty', 'Forty', 'Fifty', 'Sixty', 'Seventy', 'Eighty', 'Ninety';个位数可以重用上面小于20 时候的情况。
举例:12345 按三位分割的话写成:12,345
先处理 345
百位和十位分开处理 3 45
判断45 这个十位数十大于20 还是小于20,在这里是大于20 的,所以采用方式2
十位量级Forty 加上 各位量级 Five 最后等于 Forty Five
然后处理百位,百位是3,简单的用Three 加上量级Hundred
最后生成 Three Hundred Forty Five
此时第一组三位数处理完毕:12,345
处理12
按照同样的方法,判断其小于20,直接在情况1 的表里查询查询到其是Twelve
此时整个12345 被分成两个三元组并处理完毕,第二个三元组简单的拼接上量词Thousand 以后与前一个三元组的结果拼接:
Twelve [Thousand] Three Hundred Forty Five
各种edge case 需要处理,一是对于0 的处理,脏一点直接判断孰否为0,直接返回Zero,还有在处理三元组的时候需要判断各个元组是否为0
/** * @param {number} num * @return {string} */ var a = [ ['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'] ]; var delim = [ 'Thousand', 'Million', 'Billion' ] var numberToWords = function(num) { var d = 0; ret = []; if (num === 0) return 'Zero'; while (num > 0) { var w = convertTriple(num % 1000); if (w.length > 0) { if (d > 0) { ret.unshift(delim[d - 1]); } ret = w.concat(ret); } d++; num = parseInt(num / 1000); } return ret.join(" "); } function convertTriple(triple) { var ret = []; if (triple === 0) return ret; //deal with tenth var tuple = triple % 100; if (tuple > 0) { if (tuple < 20) { ret.push(a[0][tuple - 1]); } else { var g = tuple % 10; var tenth = Math.floor(tuple / 10); if (tenth > 1) { ret.push(a[1][tenth - 2]); } if (g > 0) { ret.push(a[0][g - 1]); } } } //deal with hundred var hundred = Math.floor(triple / 100); if (hundred > 0) { ret.unshift('Hundred'); ret.unshift(a[0][hundred - 1]); } return ret; }