LeetCode-13. 罗马数字转整数,通俗易懂解法

根据题意,存在6种特殊情况,加上原本的7中,即如下所示:

I       1
V       5
X	    10
L	    50
C	    100
D       500
M       1000

IV	    4
IX	    9
XL	    40
XC	    90
CD	    400
CM	    900

 对字符串进行转换,转化为字节数组,然后进行遍历累加值。规则固定了,例如当前值为I,后值为V时,产生特殊情况,结果为4,转换下即为3+1,其他毅如此,转换后如下所示:

I       1
V       5
X	    10
L	    50
C	    100
D       500
M       1000

IV	    4	    1+3
IX	    9	    1+8
XL	    40	    10+30
XC	    90	    10+80
CD	    400	    100+300
CM	    900	    100+800

然后开始编写代码,只需不停循环并累加对应值即可,特殊情况进行判断,单字节时可以直接使用map获取值,代码如下:

class Solution {
    public int romanToInt(String s) {
        int result = 0;
		
		char[] array = s.toCharArray();
		char temp = '0';//临时值
		
		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(char arr:array){
			if(temp=='I'){
				if(arr=='V'){
					result += 3;
					temp = '0';
				}else if(arr=='X'){
					result += 8;
					temp = '0';
				}else{
					result += map.get(arr);
					temp = arr;
				}
			}else if(temp=='X'){
				if(arr=='L'){
					result += 30;
					temp = '0';
				}else if(arr=='C'){
					result += 80;
					temp = '0';
				}else{
					result += map.get(arr);
					temp = arr;
				}
			}else if(temp=='C'){
				if(arr=='D'){
					result += 300;
					temp = '0';
				}else if(arr=='M'){
					result += 800;
					temp = '0';
				}else{
					result += map.get(arr);
					temp = arr;
				}
			}else{
				result += map.get(arr);
				temp = arr;
			}
		}
		
		return result;
    }
}

此种情况因为使用到了hashmap,会消耗较多的内存和时间,可看到

result += map.get(arr);

temp = arr;

的部分即为获取单字节值,提取所有此部分值,使用boolean判断,使用switch case来取值,能提高效率,优化后代码如下:

class Solution {
    public int romanToInt(String s) {
        int result = 0;
		
		char[] array = s.toCharArray();
		char temp = '0';//临时值
		boolean flg = false;
		
		for(char arr:array){
			if(temp=='I'){
				if(arr=='V'){
					result += 3;
					temp = '0';
				}else if(arr=='X'){
					result += 8;
					temp = '0';
				}else{
					flg = true;
				}
			}else if(temp=='X'){
				if(arr=='L'){
					result += 30;
					temp = '0';
				}else if(arr=='C'){
					result += 80;
					temp = '0';
				}else{
					flg = true;
				}
			}else if(temp=='C'){
				if(arr=='D'){
					result += 300;
					temp = '0';
				}else if(arr=='M'){
					result += 800;
					temp = '0';
				}else{
					flg = true;
				}
			}else{
				flg = true;
			}
			
			if(flg){
				switch (arr) {
				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;
				default:
					result += 1000;
					break;
				}
				
				temp = arr;
				flg = false;
			}
		}
		
		return result;
    }
}

备注:此处因为存在7个值,并且每个值的取值概率一样,所以使用switch case,而不使用if else。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值