12,13-整数互换罗马数字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class Solution { public String intToRoman (int num) { int [] values={1000 ,900 ,500 ,400 ,100 ,90 ,50 ,40 ,10 ,9 ,5 ,4 ,1 }; String[] rom={"M" ,"CM" ,"D" ,"CD" ,"C" ,"XC" ,"L" ,"XL" ,"X" ,"IX" ,"V" ,"IV" ,"I" }; StringBuilder sb=new StringBuilder(); for (int i=0 ;i<values.length;i++){ while (num>=values[i]){ sb.append(rom[i]); num-=values[i]; } } return sb.toString(); } }
通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,累加每个字符对应的数值即可。
例如 $\texttt{XXVII}$ 可视作 X+X+V+I+I=10+10+5+1+1=27。
若存在小的数字在大的数字的左边的情况,根据规则需要减去小的数字。对于这种情况,我们也可以将每个字符视作一个单独的值,若一个数字右侧的数字比它大,则将该数字的符号取反。
例如 XIV 可视作 X−I+V=10−1+5=14。
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 class Solution { Map<Character, Integer> symbolValues = new HashMap<Character, Integer>() {{ put('I' , 1 ); put('V' , 5 ); put('X' , 10 ); put('L' , 50 ); put('C' , 100 ); put('D' , 500 ); put('M' , 1000 ); }}; public int romanToInt (String s) { int ans = 0 ; int n = s.length(); for (int i = 0 ; i < n; ++i) { int value = symbolValues.get(s.charAt(i)); if (i < n - 1 && value < symbolValues.get(s.charAt(i + 1 ))) { ans -= value; } else { ans += value; } } return ans; } }