• 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;
    }
  • 相关阅读:
    JavaSE基础(七)--Java流程控制语句之switch case 语句
    JavaSE基础(六)--Java流程控制语句之条件语句
    JavaSE基础(五)--Java运算符
    搭建seafile文档系统
    centos7 DHCP搭建双机热备 集群
    centos7安装DHCP后启动不了的问题解决方法
    思科ASA防火墙精华配置总结
    思科常用命令大全
    浅谈集线器、路由器、交换机、网关的作用与区别
    交换机端口镜像及其工作原理
  • 原文地址:https://www.cnblogs.com/agentgamer/p/6236011.html
Copyright © 2020-2023  润新知