# 第十周ARTS总结

# Algorithm

7ms | 15.99% Run time
39.4MB | 14.43% Memory

public String intToRoman(int num) {
    Map<Integer, String> map = new HashMap<>();
    map.put(1, "I");
    map.put(5, "V");
    map.put(10, "X");
    map.put(50, "L");
    map.put(100, "C");
    map.put(500, "D");
    map.put(1000, "M");

    StringBuilder stringBuilder = new StringBuilder();

    int digit = 1;
    while (num > 0) {
        int lastNum = num % 10;
        stringBuilder.insert(0, intToRomanForDigit(lastNum, digit, map));

        num = num / 10;
        digit = digit * 10;
    }

    return stringBuilder.toString();
}

private String intToRomanForDigit(int num, int digit, Map<Integer, String> source) {
    StringBuilder stringBuilder = new StringBuilder();

    if (9 == num) {// 9特殊处理
        stringBuilder.append(source.get(1 * digit)).append(source.get(10 * digit));
    } else if (4 == num) {// 4特殊处理
        stringBuilder.append(source.get(1 * digit)).append(source.get(5 * digit));
    } else {
        // 大于5
        if (num - 5 >= 0) {
            stringBuilder.append(source.get(5 * digit));
        }

        // 小于5的部分
        int ext = num % 5;
        while (ext > 0) {
            stringBuilder.append(source.get(digit));
            ext--;
        }
    }

    return stringBuilder.toString();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

# Review

# Tip

  • 用到了反射的类不能被混淆,否则通过反射会找不到相应的方法

# Share

暂无内容

更新时间: 10/20/2022, 7:04:01 AM