天天看點

67、整數轉羅馬數字

題目描述:

羅馬數字包含以下七種字元: I, V, X, L,C,D 和 M。

字元 數值

I 1

V 5

X 10

L 50

C 100

D 500

M 1000

例如, 羅馬數字 2 寫做 II ,即為兩個并列的 1。12 寫做 XII ,即為 X + II 。 27 寫做 XXVII, 即為 XX + V + II 。

通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII,而是 IV。數字 1 在數字 5 的左邊,所表示的數等于大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 IX。這個特殊的規則隻适用于以下六種情況:

I 可以放在 V (5) 和 X (10) 的左邊,來表示 4 和 9。

X 可以放在 L (50) 和 C (100) 的左邊,來表示 40 和 90。

C 可以放在 D (500) 和 M (1000) 的左邊,來表示 400 和 900。

給定一個整數,将其轉為羅馬數字。輸入確定在 1 到 3999 的範圍内。

示例 1:

輸入: 3

輸出: “III”

示例 2:

輸入: 4

輸出: “IV”

示例 3:

輸入: 9

輸出: “IX”

示例 4:

輸入: 58

輸出: “LVIII”

解釋: L = 50, V = 5, III = 3.

示例 5:

輸入: 1994

輸出: “MCMXCIV”

解釋: M = 1000, CM = 900, XC = 90, IV = 4.

思路:比較簡單的一道題目,将其放入到map中然後從大到小進行周遊即可

代碼如下:

class Solution {
    public String intToRoman(int num) {
String result = "";
        Map<Integer, String> map = new TreeMap<>(new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				// TODO 自動生成的方法存根
				return -o1.compareTo(o2);
			}
		});
        
        map.put(1, "I");
        map.put(4, "IV");
        map.put(5, "V");
        map.put(9, "IX");
        map.put(10, "X");
        map.put(40, "XL");
        map.put(50, "L");
        map.put(90, "XC");
        map.put(100, "C");
        map.put(400, "CD");
        map.put(500, "D");
        map.put(900, "CM");
        map.put(1000, "M");
        System.out.println(map.toString());
        while (num != 0) {
			for (Map.Entry<Integer, String> tem: map.entrySet()) {
				int size = num / tem.getKey();
				num %= tem.getKey();
				while (size -- > 0) {
					result += tem.getValue();
				}
			}
		}       
        return result;  
    }
}
           

排名靠前的代碼

class Solution {
    public String intToRoman(int num) {
        StringBuilder sb = new StringBuilder();
        while (num > 0) {
            if (num >= 4000) {
                sb.append("IVM");
                num -= 4000;
            } else if (num >= 1000) {
                int mcount = num / 1000;
                for (int i = 0; i < mcount; i++) {
                    sb.append('M');
                }
                num -= mcount * 1000;
            } else if (num >= 900) {
                sb.append("CM");
                num -= 900;
            } else if (num >= 500) {
                sb.append('D');
                num -= 500;
            } else if (num >= 400) {
                sb.append("CD");
                num -= 400;
            } else if (num >= 100) {
                int ccount = num / 100;
                for (int i = 0; i < ccount; i++) {
                    sb.append('C');
                }
                num -= ccount * 100;
            } else if (num >= 90) {
                sb.append("XC");
                num -= 90;
            } else if (num >= 50) {
                sb.append('L');
                num -= 50;
            } else if (num >= 40) {
                sb.append("XL");
                num -= 40;
            } else if (num >= 10) {
                int xcount = num / 10;
                for (int i = 0; i < xcount; i++) {
                    sb.append('X');
                }
                num -= xcount * 10;
            } else if (num == 9) {
                sb.append("IX");
                num = 0;
            } else if (num >= 5) {
                sb.append('V');
                num -= 5;
            } else if (num == 4) {
                sb.append("IV");
                num = 0;
            } else {
                for (int i = 0; i < num; i++) {
                    sb.append('I');
                }
                num = 0;
            }
        }

        return sb.toString();
    }
}
           

可能是用map時間變得長了,思路都是一樣,要從大開始進行,一級級放入即可