Skip to content

问题描述

小红书二面算法题,没能挺过去。

将给定的数字,转换成中文汉字。

输入:num = 10001
输出:一万零一

输入:num = 201000000123
输出:两千零一十亿零一百二十三

解决思路

可以根据字符类型,拆分成三个模块;

  1. 汉字,一二三四五等;
  2. 每个汉字的单位,个十百千;
  3. 间隔四位的二层单位,个万亿;

有几个需要注意的场景;

  • 零后面不能接数值单位
  • 零后面也不能接零
  • 如果当前四位都是零则不用处理
java
private String[] arr1 = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
private String[] arr2 = {"", "十", "百", "千"};
private String[] arr3 = {"", "万", "亿"};

private String toChineseNum(long num) {
    // 0 单独处理
    if (num == 0) return arr1[0];
    long num2 = Math.abs(num);
    // 使用栈结构,从地到高逐位翻译入栈
    Deque<String> stack = new LinkedList<>();
    for (int loop = 0; num2 != 0; loop++) {
        // 万、亿
        if (num2 % 10000 != 0) stack.push(arr3[loop]);
        int lastNum = 0;
        for (int i = 0; i < 4 && num2 != 0; i++, num2 /= 10) {
            int n = (int) (num2 % 10);
            // 十百千
            if (n != 0) stack.push(arr2[i]);
            // 汉字(一二三...)
            if (n != 0 || lastNum != 0) stack.push(arr1[n]);
            lastNum = n;
        }
    }
    if (num < 0) stack.push("负");
    // 栈元素拼接成字符串
    StringBuilder builder = new StringBuilder();
    while (!stack.isEmpty()) builder.append(stack.pop());
    return builder.toString();
}

基于 MIT 许可发布