273. Integer to English Words

09/16/2021

LeetCode

Basic Idea

这题非常无聊,唯一能注意的技巧就是按照每三位分成一组,然后分别处理。另外就是可以先将要用到的字符串存起来。

Java Code

class Solution {
    String[] s19 = new String[] {
        "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight",
        "Nine", "Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen",
        "Sixteen", "Seventeen", "Eighteen", "Nineteen"
    };
    String[] s20 = new String[] {
        "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"
    };
    String s100 = "Hundred";
    String[] s1000 = new String[] {
        "Thousand", "Million", "Billion"
    };
    
    public String numberToWords(int num) {
        if (num == 0) {
            return "Zero";
        }
        List<String> res = new ArrayList<>();
        int k = 0;
        while (num > 0) {
            int curr = num % 1000;
            String part = partToWords(curr);
            if (k > 0 && part.length() != 0) {
                part = part + " " + s1000[k - 1];
            }
            if (part.length() > 0) {
                res.add(part);
            }
            num /= 1000;
            k++;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = res.size() - 1; i >= 0; --i) {
            sb.append(res.get(i));
            sb.append(" ");
        }
        return sb.toString().trim();
    }
    
    private String partToWords(int num) {
        String ret = "";
        if (num >= 100) {
            ret += s19[num / 100 - 1] + " " + s100;
        }
        if (num % 100 != 0) {
            if (num % 100 < 20) {
                ret += " " + s19[num % 100 - 1];
            } else {
                ret += " " + s20[(num % 100) / 10 - 2];
                if (num % 10 > 0) {
                    ret += " " + s19[num % 10 - 1];
                }
            }
        }
        ret = ret.trim();
        return ret;
    }
}

Last updated