Roman to Integer

今天做的习题是Roman to Integer的LeetCode,比较简单,重点是转换规则要用好,其他就没有什么了。但做完题之后还是不太明白为什么要用这个算法。

思路为:
1:将字符串转换为字符数组


2:对字符数组的每一个符号进行判断
如果大于前一个符号则加上
如果小于则加上后一个符号并且减去两倍的此符号

具体代码如下:

public class Solution {
	 public int romanToInt(String s) {
		 
		 int graph[] = new int[400];  
		 graph['I'] = 1;  
	     graph['V']=5;  
	     graph['X']=10;  
	     graph['L']=50;  
	     graph['C']=100;  
	     graph['D']=500;  
	     graph['M']=1000;   
	     char[] romanNum=s.toCharArray();
	     int sum=graph[romanNum[0]];
	     for(int i=0;i<romanNum.length-1;i++){
	    	 if(graph[romanNum[i]]>=graph[romanNum[i+1]])
	    		 sum+=graph[romanNum[i+1]];
	    	 else
	    		 sum+=graph[romanNum[i+1]]-2*graph[romanNum[i]];
	     }
		 return sum;
	    }


学到的新的做法就是将字母变成数组的序号进行赋值,每个字母代表不同的值。然后将罗马数字拆分成一个个字符找到每个字符对应的数字,再根据相应的法则进行加减,最终得出正确结果,这个算法的运行速度还算不错。

看了一下其他的算法,有的是不对的,有的视根据罗马数字的构造法则分出了很多特殊情况。


有一种很简单也很用以理解的方法就是:

	 public int romanToInt(String s) {
		    int nums[]=new int[s.length()];
		    for(int i=0;i<s.length();i++){
		        switch (s.charAt(i)){
		            case 'M':
		                nums[i]=1000;
		                break;
		            case 'D':
		                nums[i]=500;
		                break;
		            case 'C':
		                nums[i]=100;
		                break;
		            case 'L':
		                nums[i]=50;
		                break;
		            case 'X' :
		                nums[i]=10;
		                break;
		            case 'V':
		                nums[i]=5;
		                break;
		            case 'I':
		                nums[i]=1;
		                break;
		        }
		    }
		    int sum=0;
		    for(int i=0;i<nums.length-1;i++){
		        if(nums[i]<nums[i+1])
		            sum-=nums[i];
		        else
		            sum+=nums[i];
		    }
		    return sum+nums[nums.length-1];
		}

思路就是先创建与字符串长度相同的整数数组,根据相应位置的字母设置相应位置的整数值。 比较对应位置的整数值后其后一个位置的整数值,如果是大于等于的关系就加上这个位置的数,否则减去这个位置的数字,最后加上最后一位的数字。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值