Leetcode(13) - 罗马数字转整数- java版
题目
罗马数字包含以下七种字符: I
, V
, X
, L
,C
,D
和 M
。
字符 | 数值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
- I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
- X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
- C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
难度: 简单
示例1:
输入: "III"
输出: 3
示例2:
输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.
示例3:
输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.
一. 循环&加上基数
具体思路:
通过循环将s的每一位同所有罗马数字相对比( 按照从大到小的顺序) , 当找到对应的罗马数字后 , 把num加上对应值
当遍历完字符串s 的每一位后 , 得到的num 即为答案.
这里注意: 400,900,40,90,4,9所对应的罗马数字比较特别 , 需要设置嵌套if语句进行二次判断.
实现:
class Solution {
public int romanToInt(String s) {
int i = 0;//str's index
int num = 0;
while(i < s.length()){
if(s.charAt(i) == 'M'){
num += 1000;
i++;
}else if(s.charAt(i) == 'D'){
num += 500;
i++;
}else if(s.charAt(i) == 'C'){
// 防止数组越界
if(i+1 == s.length()){
num += 100;
break;
}
if(s.charAt(i+1) == 'M'){
num += 900;
i += 2;
}else if(s.charAt(i+1) == 'D'){
num += 400;
i += 2;
}else{
num += 100;
i++;
}
}else if(s.charAt(i) == 'L'){
num += 50;
i++;
}else if(s.charAt(i) == 'X'){
// 防止数组越界
if(i+1 == s.length()){
num += 10;;
break;
}
if(s.charAt(i+1) == 'C'){
num += 90;
i += 2;
}else if(s.charAt(i+1) == 'L'){
num += 40;
i += 2;
}else{
num += 10;
i++;
}
}else if(s.charAt(i) == 'V'){
num += 5;
i++;
}else{
// 防止数组越界
if(i+1 == s.length()){
num++;
break;
}
if(s.charAt(i+1) == 'X'){
num += 9;
i += 2;
}else if(s.charAt(i+1) == 'V'){
num += 4;
i += 2;
}else{
num += 1;
i++;
}
}
}
return num;
}
}
二. HashMap匹配法
具体思路:
先将罗马数字和整数的对应关系存入一个map中 , key为Character ,value 为Integer.
之后将ret 初始化为 s最后一位罗马数字对应的整数,
下一步,将s从右向左开始迭代 , 如果前一个字符代表的数字比后一个小,则 ret 减去它代表的数字 , 如果比后一个大,则 ret 加上它代表的数字。
最后, 返回ret即可.
实现:
class Solution {
public int romanToInt(String s) {
HashMap<Character,Integer> map = new HashMap<>();
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);
int len = s.length(),ret = map.get(s.charAt(len-1));
for(int i = len -2;i>=0;i--){
if(map.get(s.charAt(i)) < map.get(s.charAt(i+1)))
ret -= map.get(s.charAt(i));
else ret += map.get(s.charAt(i));
}
return ret;
}
}
网友评论