leetcode12

Page content

题目描述

整数转罗马数字LC

题目链接:https://leetcode-cn.com/problems/integer-to-roman/

思路

首先罗马数字是一种数字符号表现形式,罗马数字对于数的表示法依然采用了十进制的形式,这一点很重要,尽管会有单独的符号来表示5,50, 500等,但是这些字符仅仅是符号表示的辅助符号。

数位表示符:

个位 十位 百位 千位
I X C M

辅助表示符:

个位 十位 百位
V L D

罗马数字表示规则如下:

  1. 当前数位上的数字小于4,直接用当前数位表示符表示。

  2. 当前数位上的数字等于4, 用当前数位表示符 + 当前数位辅助表示符进行表示。

  3. 当前数位上的数字大于等于5, 用当前数位辅助表示符 + 当前数位表示符进行表示。

  4. 当前数位上的数字等于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();