leetcode12
Page content
题目描述
题目链接:https://leetcode-cn.com/problems/integer-to-roman/
思路
首先罗马数字是一种数字符号表现形式,罗马数字对于数的表示法依然采用了十进制的形式,这一点很重要,尽管会有单独的符号来表示5,50, 500等,但是这些字符仅仅是符号表示的辅助符号。
数位表示符:
个位 | 十位 | 百位 | 千位 |
---|---|---|---|
I | X | C | M |
辅助表示符:
个位 | 十位 | 百位 |
---|---|---|
V | L | D |
罗马数字表示规则如下:
-
若当前数位上的数字小于4,直接用当前数位表示符表示。
-
若当前数位上的数字等于4, 用当前数位表示符 + 当前数位辅助表示符进行表示。
-
若当前数位上的数字大于等于5, 用当前数位辅助表示符 + 当前数位表示符进行表示。
-
若当前数位上的数字等于9,用当前数位表示符 + 下一数位表示符进行表示。
Java AC代码
var stack = new Stack<Character>();
// 1 10 100 1000
var bitSymbol = new char[] {'I', 'X', 'C', 'M'};
// 5 50 500
var assistantBitSymbol = new char[] {'V', 'L', 'D'};
var bit = 0;
for(;;) {
var bitNumber = num % 10;
var symbol = bitSymbol[bit];
if (bitNumber < 4) {
for (int i = 0; i < bitNumber; ++i) { stack.push(symbol); }
} else if (bitNumber == 4) {
stack.push(assistantBitSymbol[bit]);
stack.push(symbol);
} else if (bitNumber < 9) {
for (int i = 0; i < bitNumber - 5; ++i) {
stack.push(symbol);
}
stack.push(assistantBitSymbol[bit]);
} else {
stack.push(bitSymbol[bit + 1]);
stack.push(symbol);
}
bit++;
if (num / 10 != 0) {
num /= 10;
}else {
break;
}
}
var stringBuilder = new StringBuilder();
while (!stack.isEmpty()) { stringBuilder.append(stack.pop()); }
return stringBuilder.toString();