[Leetcode] 273. Integer to English Words

题目:
Convert a non-negative integer to its english words representation. Given input is guaranteed to be less than 231 - 1.

For example,

123 -> “One Hundred Twenty Three”
12345 -> “Twelve Thousand Three Hundred Forty Five”
1234567 -> “One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven”

思路:一看到这个题目想到的是英文数字的规律是从右边3位一组,所以只需把3位一组的数读出加上该对应3位的权(姑且叫权吧,不知道咋说)Billion Million Thousand 即可。
问题就转化为3位数字如何转化为英文。
我的想法百位的数字对应的英文加Hundred,十位数字对应的相应的英文,个位对应的各自的英文数字。
问题即为如何对应相应的英文数字。
我首先想到的是利用map存储对应关系。然后依次读取进行处理。

注意的问题:结果字符串中空格的处理

具体代码:

public class Solution {
    public String numberToWords(int num) {
        if(num == 0){
            return "Zero";
        }
        StringBuffer result = new StringBuffer();
        String s = new Integer(num).toString();
        int len = s.length();
        //len不是3的整数倍时将前面加0
        while(len % 3 != 0){
            s = "0" + s;
            len++;
        }
        int count  = len / 3;
        int i = 0;
        while(i < count){
            String sub = s.substring(i*3,3*i+3);
            //若此时result的已经不为空,在追加后3位的结果时,加" "
            if(result.equals("") == false){
                result.append(" ");
            }
            result.append(fun(sub));
            //根据该3位的位置相应的追加权重
            if(count-i == 4 && sub.equals("000") == false){
                result.append(" Billion");
            }
            if(count-i == 3 && sub.equals("000") == false){
                result.append(" Million");
            }
            if(count-i == 2 && sub.equals("000") == false){
                result.append(" Thousand");
            }
            i++;
        }

        String re = result.toString().trim();
        while(re.contains("  ") ){
            re = re.replaceAll("  ", " ");
        }
        return re;
    }
    //处理3位  将3位数转化成对应的英文
    public String fun(String s){
        StringBuffer result = new StringBuffer();
        if(s == "000"){
            return "";
        }
        Map<String, String> map = new HashMap();
        map.put("0","");
        map.put("00","");
        map.put("1", "One");
        map.put("2", "Two");
        map.put("3", "Three");
        map.put("4", "Four");
        map.put("5", "Five");
        map.put("6", "Six");
        map.put("7", "Seven");
        map.put("8", "Eight");
        map.put("9", "Nine");
        map.put("10", "Ten");
        map.put("11", "Eleven");
        map.put("12", "Twelve");
        map.put("13", "Thirteen");
        map.put("14", "Fourteen");
        map.put("15", "Fifteen");
        map.put("16", "Sixteen");
        map.put("17", "Seventeen");
        map.put("18", "Eighteen");
        map.put("19", "Nineteen");
        map.put("20", "Twenty");
        map.put("30", "Thirty");
        map.put("40", "Forty");
        map.put("50", "Fifty");
        map.put("60", "Sixty");
        map.put("70", "Seventy");
        map.put("80", "Eighty");
        map.put("90", "Ninety");

        if(s.charAt(0) != '0'){
            result.append(map.get(s.charAt(0)+""));
            result.append(" ");
            result.append("Hundred");
        }
        //11 12 13....19的处理特殊
        if(s.charAt(1) == '1'){
            String ss = s.charAt(1)+""+s.charAt(2);
            if(result.equals("") == false){
                result.append(" ");
            }
            result.append(map.get(ss));
        }else{
            if(result.equals("")== false){
                result.append(" ");
            }
            result.append(map.get(s.charAt(1)+"0"));
            if(s.charAt(2) != '0'){
                result.append(" ");
            }
            result.append(map.get(s.charAt(2)+""));
        }
        return result.toString().trim();
    }
}

代码有些冗长,但是思路还算简单,看了一下Leetcode Discuss中最hot的解题方法,是利用数组存储这些对应的英文,利用数组相应的位置对应关系处理的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值