今天在V2EX上面看到一个招聘的帖子,附了一个面试题,面试题本身比较简单。
[整数数字转读音]
string num2Voice(int num) { … }
例:输入: 12345 输出:一万二千三百四十五
(时间 20min 内完成代码并能够跑通)
答案:(我的答案,非标准答案)
public class Test {
String num2Voice(int num) {
return toList(split(num)).stream().map(x -> numbers[x.val] + units[x.index]).reduce(String::concat).orElse("");
}
class X {
int val;
int index;
X(int val, int index) {
this.val = val;
this.index = index;
}
}
Stack<X> split(int num) {
Stack<X> stack = new Stack<>();
int index = 0;
while (num > 0) {
int val = num % 10;
stack.push(new X(val, index));
num /= 10;
index++;
}
return stack;
}
<E> List<E> toList(Stack<E> stack) {
ArrayList<E> r = new ArrayList<>();
while (!stack.isEmpty()) {
r.add(stack.pop());
}
return r;
}
static String[] numbers = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
static String[] units = {"", "十", "百", "千","万", "十万", "百万", "千万", "亿"};
public static void main(String[] args){
System.out.println(new Test().num2Voice(12345));
}
}
因此发现一个问题,自带的Stack的Stream竟然是顺序的,导致我虽然用的栈,仍然需要手动把他反过来。直觉上来说,stack的流应该和插入顺序相反,所以准备自定一个Stack支持Stream API。
网友评论