罗马转数字,如果i位比i+1位小,那么说明是i+1位的字母代表数字 - i位的数字。例如:
XL, X ( = 10) < L ( =50),那么应该为L-X = 40. 如果是这个情况,光标左移动两位。否则移动一位。
数字转字母,根据当前数字%dividor的情况,分为9, 5-8, 4, 1-3几种情况。
public class Solution {
public int romanToInt(String s) {
// Start typing your Java solution below
// DO NOT write main() function
int result = 0;
int i = s.length() - 1;
while (i >= 0) {
if (i > 0 && helper(s.charAt(i)) > helper(s.charAt(i-1))) {
result = result - helper(s.charAt(i-1)) +
helper(s.charAt(i));
i -= 2;
} else {
result += helper(s.charAt(i));
i--;
}
}
return result;
}
int helper (char c) {
switch (c) {
case 'M': return 1000;
case 'D': return 500;
case 'C': return 100;
case 'L': return 50;
case 'X': return 10;
case 'V': return 5;
case 'I': return 1;
}
return 0;
}
}
public class Solution {
public String intToRoman(int num) {
// Start typing your Java solution below
// DO NOT write main() function
String result = "";
int tmp = num;
int dividor = 1000;
int i = 0;
String roman = "MCXIDLV";
while ( dividor > 0) {
int cur = tmp/dividor;
switch (cur) {
case 9:
result = result + roman.charAt(i);
result = result + roman.charAt(i-1);
break;
case 5: case 6: case 7: case 8:
result = result + roman.charAt(i+3);
for (int j = 5; j < cur; j++) {
result = result + roman.charAt(i);
}
break;
case 4:
result = result + roman.charAt(i);
result = result + roman.charAt(i+3);
break;
case 3: case 2: case 1:
for (int j = 0; j < cur; j++) {
result = result + roman.charAt(i);
}
break;
}
i++;
tmp = tmp%dividor;
dividor /= 10;
}
return result;
}
}