题目描述:
注:本分类博客中的所有代码可以直接拷贝到eclipise
代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
*
*
* @版权 : Copyright (c) 2017-2018 *********公司技术开发部
* @author: gaozhenchao
* @E-mail: 1226046769@qq.com
* @版本: 1.0
* @创建日期: 2019年1月23日 下午4:42:46
* @ClassName Solution
* @类描述-Description: 给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
* @修改记录:
* @版本: 1.0
*/
class Solution {
public int romanToInt(String s) {
int result = 0;
char[] charArray = s.toCharArray();
//另一种方法:
// Map<Character, Integer> map = new HashMap<Character, Integer>();
//
// map.put('I', 1);
// map.put('V', 5);
// map.put('X', 10);
// map.put('L', 50);
// map.put('C', 100);
// map.put('D', 500);
// map.put('M', 1000);
for (int i = 0; i < charArray.length; i++) {
// 防止数组越界
if (i + 1 < charArray.length) {
// 匹配特殊情况
// I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9
if (charArray[i] == 'I' && charArray[i + 1] == 'V') {
result += 4;
i = i + 1;
continue;
} else if (charArray[i] == 'I' && charArray[i + 1] == 'X') {
result += 9;
i = i + 1;
continue;
// X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90
} else if (charArray[i] == 'X' && charArray[i + 1] == 'L') {
result += 40;
i = i + 1;
continue;
} else if (charArray[i] == 'X' && charArray[i + 1] == 'C') {
result += 90;
i = i + 1;
continue;
// C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900
} else if (charArray[i] == 'C' && charArray[i + 1] == 'D') {
result += 400;
i = i + 1;
continue;
} else if (charArray[i] == 'C' && charArray[i + 1] == 'M') {
result += 900;
i = i + 1;
continue;
}
}
//另一种方法:
// for (Entry<Character, Integer> entry : map.entrySet()) {
// if (charArray[i] == entry.getKey()) {
// result += entry.getValue();
// }
//
// }
switch (charArray[i]) {
case 'I':
result += 1;
break;
case 'V':
result += 5;
break;
case 'X':
result += 10;
break;
case 'L':
result += 50;
break;
case 'C':
result += 100;
break;
case 'D':
result += 500;
break;
case 'M':
result += 1000;
break;
}
}
return result;
}
}
// public class Solution {
// public bool IsPalindrome(int x) {
// // 特殊情况:
// // 如上所述,当 x < 0 时,x 不是回文数。
// // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
// // 则其第一位数字也应该是 0
// // 只有 0 满足这一属性
// if(x < 0 || (x % 10 == 0 && x != 0)) {
// return false;
// }
//
// int revertedNumber = 0;
// while(x > revertedNumber) {
// revertedNumber = revertedNumber * 10 + x % 10;
// x /= 10;
// }
//
// // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
// // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
// // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
// return x == revertedNumber || x == revertedNumber/10;
// }
// }
public class MainClass {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String line;
while ((line = in.readLine()) != null) {
int ret = new Solution().romanToInt(line);
String out = String.valueOf(ret);
System.out.println(out);
}
}
}