Roman to Integer

225 篇文章 0 订阅
50 篇文章 0 订阅

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.



搞了挺久一直没搞出来。看了网上的参考后知道是推导的公式写错了。如果是从高位往地位扫(也就是一次循环用s.charAt(i)由高往低),那么相邻元素之间的关系是:1当前元素如果是最高位,先加上对应的元素 2 如果当前元素roman[s.charAt(i)] 比上一个元素roman[s.charAt(i-1)]的数字大,那么由于上一个循环已经加过一次 roman[s.charAt(i-1)],所以需要减去两倍的roman[s.charAt(i-1)],先抵消上一回多加的,然后再正常减去一个。


实现代码:

其实我觉也可以反向循环做这道题,判断roman[s.charAt(i)] 跟roman[s.charAt(i+1)] 的大小关系,有机会补上。

public class Solution {
 public int romanToInt(String s) {
		int []roman = new int[256];
		roman['I']=1;
		roman['V']=5;
		roman['X']=10;
		roman['L']=50;
		roman['C']=100;
		roman['D']=500;
		roman['M']=1000;
		int result=0;
		result =roman[s.charAt(0)];
		for(int i=1;i<s.length();i++){
			int location =s.charAt(i);
         	int locationP = s.charAt(i-1);
			if(i==0){
				result =roman[location];
				//System.out.println("init: "+roman[location]);
				continue;
			}
			
			if(roman[locationP]< roman[location]){
				result += roman[location] -2*roman[locationP];
			//	System.out.println("-: roman[location],roman[location+1]"+roman[location]+" "+roman[location+1]);
				
			}
			else{
				result+=roman[location] ;
			//	System.out.println("+: "+roman[(char)location]);
			}
			
			
			
		}
		
		
		
		return result;
		
        
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值