import java.util.*;
/**
* NC361 整数转罗马数字
* @author d3y1
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param n int整型
* @return string字符串
*/
public String ArabicToRoman (int n) {
// return solution1(n);
return solution2(n);
}
private final int[] values = new int[]{1000, 500, 100, 50, 10, 5, 1};
private final HashMap<Integer,Character> map = new HashMap<Integer,Character>(){{
put(1, 'I');
put(5, 'V');
put(10, 'X');
put(50, 'L');
put(100, 'C');
put(500, 'D');
put(1000, 'M');
}};
/**
* 哈希: HashMap
* @param n
* @return
*/
private String solution1(int n){
StringBuilder sb = new StringBuilder();
int remain = n;
int times;
for(int val: values){
times = remain/val;
remain = remain%val;
while(times-- > 0){
sb.append(map.get(val));
}
if(remain == 0){
break;
}
}
// 四连情况处理 VIIII LXXXX DCCCC | IIII XXXX CCCC
String result = sb.toString().replace("VIIII", "IX").replace("LXXXX", "XC").replace("DCCCC", "CM").replace("IIII", "IV").replace("XXXX", "XL").replace("CCCC", "CD");
return result;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
private final int[] arabics = new int[]{1000,900,500,400,100,90,50,40,10,9,5,4,1};
private final String[] romans = new String[]{"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
/**
* 哈希: 数组
* @param n
* @return
*/
private String solution2(int n){
StringBuilder sb = new StringBuilder();
int remain = n;
int times;
int val;
for(int i=0; i<arabics.length; i++){
val = arabics[i];
times = remain/val;
remain = remain%val;
while(times-- > 0){
sb.append(romans[i]);
}
if(remain == 0){
break;
}
}
return sb.toString();
}
}