题解 | #学英语#

学英语

https://www.nowcoder.com/practice/1364723563ab43c99f3d38b5abef83bc

思路:在英语读法中3位数字看成一整体,后面再加计数单位,故实际上任何一个n都可以视为多个3位数的拼接,只需将每个3位数都转换为英文,再和million,thousand等关联词进行拼接,即可进行翻译,需要注意考虑一些特殊情况下hundred、and和空格是否存在。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            long n = sc.nextLong();
            String s = String.valueOf(n);
            int len = s.length();
            StringBuilder res = new StringBuilder();
            //根据n(0-2000000)的位数大小,分情况讨论:1-3位数,4-6位数,7-9位数
            //将n按3位截断,用numberToenglish(s)方法转换成英文再和million、thousand进行拼接即得结果
            if (len <= 3) {
                res.append(numberToenglish(s));
            } else if (len <= 6) {
                res.append(numberToenglish(s.substring(0, len - 3)));
                res.append(" thousand");
                //如果后三位为0,则不用拼接
                if (Integer.parseInt(s.substring(len - 3)) > 0) {
                    res.append(" ");
                    res.append(numberToenglish(s.substring(len - 3)));
                }
            } else if (len > 6) {
                res.append(numberToenglish(s.substring(0, len - 6)));
                res.append(" million");
                //如果中三位为0,则thousand部分不用拼接
                if (Integer.parseInt(s.substring(len - 6, len - 3)) > 0) {
                    res.append(" ");
                    res.append(numberToenglish(s.substring(len - 6, len - 3)));
                    res.append(" thousand");
                }
                //如果后三位为0,则不用拼接
                if (Integer.parseInt(s.substring(len - 3)) > 0) {
                    res.append(" ");
                    res.append(numberToenglish(s.substring(len - 3)));
                }
            }
            System.out.println(res.toString());
        }
    }

    //将一个000-999的三位数字符串转换为英文
    public static String numberToenglish(String s) {
        HashMap<Integer, String> m = new HashMap<>();
        m.put(0, "");
        m.put(1, "one");
        m.put(2, "two");
        m.put(3, "three");
        m.put(4, "four");
        m.put(5, "five");
        m.put(6, "six");
        m.put(7, "seven");
        m.put(8, "eight");
        m.put(9, "nine");
        m.put(10, "ten");
        m.put(11, "eleven");
        m.put(12, "twelve");
        m.put(13, "thirteen");
        m.put(14, "fourteen");
        m.put(15, "fifteen");
        m.put(16, "sixteen");
        m.put(17, "seventeen");
        m.put(18, "eighteen");
        m.put(19, "nineteen");
        m.put(20, "twenty");
        m.put(30, "thirty");
        m.put(40, "forty");
        m.put(50, "fifty");
        m.put(60, "sixty");
        m.put(70, "seventy");
        m.put(80, "eighty");
        m.put(90, "ninety");
        //将三位数字符串前面的0去除,避免000,001,011等情况
        if (s.charAt(0) == '0') {
            s = s.substring(1);
            if (s.charAt(0) == '0') {
                s = s.substring(1);
                if (s.charAt(0) == '0') {
                    return "";
                }
            }
        }
        //根据该三位数字符串的位数分情况讨论
        if (s.length() == 1) {
            return m.get(Integer.parseInt(s));
        } else if (s.length() == 2) {
            //10-19有专门的英文单词,故需要单独讨论
            if (s.charAt(0) == '1') {
                return m.get(Integer.parseInt(s));
            } else {
                //得出个位数 以及 整十(不是十位数)
                int single = Integer.parseInt(String.valueOf(s.charAt(1)));
                int ten = Integer.parseInt(s) - Integer.parseInt(String.valueOf(s.charAt(1)));
                //注意如果个位数为0,则中间空格不用拼接
                if (single == 0) {
                    return m.get(ten);
                } else {
                    return m.get(ten) + " " + m.get(single);
                }
            }
        } else {
            //得出百位数、个位数 以及 整十(不是十位数)
            int hundred = Integer.parseInt(String.valueOf(s.charAt(0)));
            int single = Integer.parseInt(String.valueOf(s.charAt(2)));
            int ten = Integer.parseInt(s.substring(1)) - Integer.parseInt(String.valueOf(
                          s.charAt(2)));
            StringBuilder sb = new StringBuilder();
            sb.append(m.get(hundred) + " hundred");
            if (s.charAt(1) == '1') {
                sb.append(" and " + m.get(Integer.parseInt(s.substring(1))));
            } else {
                //根据十位数、个位数是否为0,分情况进行判断
                if (s.charAt(1) != '0' || single != 0) {
                    sb.append(" and");
                    if (s.charAt(1) != '0') {
                        sb.append(" " + m.get(ten));
                    }
                    if (single != 0) {
                        sb.append(" " + m.get(single));
                    }
                }
            }
            return sb.toString();
        }
    }
}

全部评论

相关推荐

这一生如履薄冰:美赛s就别写了吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务