问题描述
小红书二面算法题,没能挺过去。
将给定的数字,转换成中文汉字。
输入:num = 10001
输出:一万零一
输入:num = 201000000123
输出:两千零一十亿零一百二十三
解决思路
可以根据字符类型,拆分成三个模块;
- 汉字,一二三四五等;
- 每个汉字的单位,个十百千;
- 间隔四位的二层单位,个万亿;
有几个需要注意的场景;
- 零后面不能接数值单位
- 零后面也不能接零
- 如果当前四位都是零则不用处理
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();
}