题解 | #阿拉伯数字转中文#

阿拉伯数字转中文

http://www.nowcoder.com/practice/6eec992558164276a51d86d71678b300

虽然比较地繁琐,但是性能还可以

public class Solution {

public String num2cn (int n) {
    // write code here
    boolean negative = false;
    if(n==0){
        return "零";
    }
    //变负为正
    if(n<0){
        n=Math.abs(n);
        negative=true;
    }
    StringBuilder stringBuilder = new StringBuilder();
    //整数转字符串
    String res = String.valueOf(n);
    String[] splits = res.split("");
    int length = splits.length;
    //构建单位集合,注意重量级的单位要倒过来写
    HashMap<Integer,String> unitMap = new HashMap<>();
    unitMap.put(1,"十");
    unitMap.put(2,"百");
    unitMap.put(3,"千");
    unitMap.put(4,"万");
    unitMap.put(5,"万十");
    unitMap.put(6,"万百");
    unitMap.put(7,"万千");
    unitMap.put(8,"亿");
    unitMap.put(9,"亿十");
    //构建数字集合
    HashMap<String,String> numberMap = new HashMap<>();
    numberMap.put("0","零");
    numberMap.put("1","一");
    numberMap.put("2","二");
    numberMap.put("3","三");
    numberMap.put("4","四");
    numberMap.put("5","五");
    numberMap.put("6","六");
    numberMap.put("7","七");
    numberMap.put("8","八");
    numberMap.put("9","九");
    //将阿拉伯数字转为中文
    for (int i = length - 1; i >= 0; i--) {
        String temp = splits[i];
        if(!temp.equals("0")){
            stringBuilder.append(unitMap.getOrDefault(length-i-1,""));
            stringBuilder.append(numberMap.get(temp));
        } else {
            stringBuilder.append("零");
        }
    }
    //去除最左边连续的零
    while (stringBuilder.charAt(0)=='零'){
        stringBuilder.deleteCharAt(0);
    }
    //去除中间部分连续的零,只保留一个零
    for (int i = stringBuilder.length()-1; i >=0; i--) {
        if(stringBuilder.charAt(i)=='零'&&stringBuilder.charAt(i+1)=='零'){
            stringBuilder.deleteCharAt(i);
        }
    }
    //去掉最前面的一十中的一
    if(stringBuilder.charAt(stringBuilder.length()-1)=='一'&&
            stringBuilder.charAt(stringBuilder.length()-2)=='十'){
        stringBuilder.deleteCharAt(stringBuilder.length()-1);
    }
    //如果是负数还要添加负字
    if(negative){
        stringBuilder.append("负");
    }
    StringBuilder reverseStringBuilder = stringBuilder.reverse();
    //因为亿字有重复,所以要去掉多余的亿,只留一个亿字
    int index = 0;
    for (int i = 0; i < reverseStringBuilder.length(); i++) {
        if(reverseStringBuilder.charAt(i)=='亿'){
            index++;
        }
    }
    while (index>1){
        for (int i = 0; i < reverseStringBuilder.length(); i++) {
            if(reverseStringBuilder.charAt(i)=='亿'){
                reverseStringBuilder.deleteCharAt(i);
                break;
            }
        }
        index--;
    }
    //因为万字有多余,所以要去掉多余的万字,只留一个万字
    index = 0;
    for (int i = 0; i < reverseStringBuilder.length(); i++) {
        if(reverseStringBuilder.charAt(i)=='万'){
            index++;
        }
    }
    while (index>1){
        for (int i = 0; i < reverseStringBuilder.length(); i++) {
            if(reverseStringBuilder.charAt(i)=='万'){
                reverseStringBuilder.deleteCharAt(i);
                break;
            }
        }
        index--;
    }
    return reverseStringBuilder.toString();
}

}

全部评论

相关推荐

程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
od现在都成这样了&nbsp;就业市场真是crazy
牛客473059135号:没事,我有个朋友是985本硕学计算机的,被华为卡目标院校了简历挂,不过不是od虽然人家拿到一堆别的offer了就挺搞笑的属于是……
点赞 评论 收藏
分享
评论
8
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务