Saturday, April 29, 2017

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"


Solution:

Hard code English words into three arrays.

If a number is less than 20, it can be represented only use array belowTwenty.

If a number is less than 100, we need to use array belowHundred to present tens and use belowTwenty to present single digit.

If a number is less than 1,000, we need belowTwenty to present number of Hundred and the rest can be presented using the above methods.

If a number is larger, we iteratively present its "Thousand", "Million", or "Billion".


Code:


public class Solution {
    
    private final String[] belowTwenty = {"", "One", "Two", "Three", "Four", 
                                          "Five", "Six", "Seven", "Eight", 
                                          "Nine", "Ten", "Eleven", "Twelve",
                                          "Thirteen", "Fourteen", "Fifteen", 
                                          "Sixteen", "Seventeen", "Eighteen", 
                                          "Nineteen"};
    private final String[] belowHundred = {"", "Ten", "Twenty", "Thirty", 
                                           "Forty", "Fifty", "Sixty", 
                                           "Seventy", "Eighty", "Ninety"};
    public String numberToWords(int num) {
        if (num == 0) {
            return "Zero";
        }
        
        return helper(num);
    }
    
    public String helper(int num) {
        String result;
        if (num < 20) {
            result = belowTwenty[num];
        }
        else if (num < 100) {
            result = belowHundred[num / 10] + " " + helper(num % 10);
        }
        else if (num < 1000) {
            result = helper(num / 100) + " Hundred " + helper(num % 100);
        }
        else if (num < 1000000) {
            result = helper(num / 1000) + " Thousand " + helper(num % 1000);
        }
        else if (num < 1000000000) {
            result = helper(num / 1000000) + " Million " + helper(num % 1000000);
        }
        else {
            result = helper(num / 1000000000) + " Billion " + helper(num % 1000000000);
        }
        return result.trim();
    }
}