Integer to English Words

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;
}
原文地址:https://www.cnblogs.com/agentgamer/p/6236011.html