leetcode–integer_to_roman && roman_to_integer
题意:给定一个integer,把它转化成罗马数字(本题integer的取值范围是[1, 3999])
tips
罗马数字一共由7个字符构成,分别是I(1),V(5),X(10),L(50),C(100),D(500),M(1000),能够表示的范围刚好就是[1, 3999]。本题求解需要首先了解罗马数字的构成,如1到12分别表示为:Ⅰ、Ⅱ、Ⅲ、Ⅳ、Ⅴ、Ⅵ、Ⅶ、Ⅷ、Ⅸ、Ⅹ、Ⅺ、Ⅻ。罗马数字对照表给出详细的罗马数字表示,读者可以自行查看了解题意。
分析: 本题载了解了罗马数字组合方式的前提下,就不是很难了,只是一个简单的对integer类型数据的处理,通过整除得到千位、十位、个位,例如我们得到个位的数字x,只要将x的值是否满足0、[1, 3]、4、[5, 8]、9几种情况分别讨论即可。
代码
代码写的比较凌乱……还请见谅
public String intToRoman(int num) {
StringBuffer buffer = new StringBuffer();
int temp = num/1000; //表示几千,最大值就是3(本题范围是[1,3999])
while(temp > 0){
buffer.append("M");
temp--;
}
num = num % 1000;
temp = num/100; //表示千位
if(temp > 0 && temp < 4){
while(temp > 0){
buffer.append("C");
temp--;
}
}else if(temp == 4){
buffer.append("CD");
}else if(temp > 4 && temp <= 8){
buffer.append("D");
temp -= 5;
while(temp > 0){
buffer.append("C");
temp--;
}
}else if(temp == 9){
buffer.append("CM");
}
num = num % 100;
temp = num / 10; //表示十位
if(temp > 0 && temp < 4){
while(temp > 0){
buffer.append("X");
temp--;
}
}else if(temp == 4){
buffer.append("XL");
}else if(temp > 4 && temp <= 8){
buffer.append("L");
temp -= 5;
while(temp > 0){
buffer.append("X");
temp--;
}
}else if(temp == 9){
buffer.append("XC");
}
temp = num % 10; //表示个位
if(temp > 0 && temp < 4){
while(temp > 0){
buffer.append("I");
temp--;
}
}else if(temp == 4){
buffer.append("IV");
}else if(temp > 4 && temp <= 8){
buffer.append("V");
temp -= 5;
while(temp > 0){
buffer.append("I");
temp--;
}
}else if(temp == 9){
buffer.append("IX");
}
return buffer.toString();
}
反之,将罗马数字转换成integer
分析: 将罗马数字转换成integer时只需要着重注意IV,IX,XL,XC,CD,CM这几种情况,其他的直接转换成相应数字即可。
public int romanToInt(String s) {
int sum = 0;
for(int i = s.length() - 1; i >= 0; i--){
if(s.charAt(i) == 'I'){
sum += 1;
}else if(s.charAt(i) == 'V'){
sum += 5;
if(i-1 >= 0 && s.charAt(i-1) == 'I'){ //IV
sum -= 1;
i--;
}
}else if(s.charAt(i) == 'X'){
sum += 10;
if(i-1 >= 0 && s.charAt(i-1) == 'I'){ //IX
sum -= 1;
i--;
}
}else if(s.charAt(i) == 'L'){
sum += 50;
if(i-1 >= 0 && s.charAt(i-1) == 'X'){ //XL
sum -= 10;
i--;
}
}else if(s.charAt(i) == 'C'){
sum += 100;
if(i-1 >= 0 && s.charAt(i-1) == 'X'){ //XC
sum -= 10;
i--;
}
}else if(s.charAt(i) == 'D'){
sum += 500;
if(i-1 >= 0 && s.charAt(i-1) == 'C'){ //CD
sum -= 100;
i--;
}
}else{
sum += 1000;
if(i-1 >= 0 && s.charAt(i-1) == 'C'){ //CM
sum -= 100;
i--;
}
}
}
return sum;
}