[LeetCode][13]Roman to Integer解析 罗马字符转int类型关于栈的常数实现-Java实现

Q:

Given a roman numeral, convert it to an integer.

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

A:

以下解法和代码没有借阅以往任何资料,如果有更好的解法请在评论区留言

看到这一题我真是感叹城会玩,昨天刚刚解过一个int转罗马字母,今天又反过来解。自叹弗如。这题的该意思就是给一个罗马字符,把他转化成一个int数字,范围在1~3999之间。关于罗马数字的详细信息就不复制了,如果有不懂的请移步int转罗马数字

首先我们需要知道的是,在int中个位十位百位千位都是只有一位数字表示的,如1、3、9.但是在罗马字符中每一位的个数都可能不同如:I、II、III,这就要求我们必须找到一种办法来区分罗马的各个位。我们知道很明显的罗马数字中的X一出现这一个数字的范围就在9~13之间,也就是说一但出现了诸如X、C、M这三个字符的,如果在左侧没有一个对应的-1的话(IX,XC,CM),那么他就代表了进位。其次我们需要知道一个字符的左侧只会出现4和9这种情况(IV、IX、XC等)。这样我们就出现了两种思路:

1、按照进位计算,跟昨天解决int转罗马字符很像。

2、按照从高位到低位相加减运算。

我选择了2,为什么呢?因为1中的进位其实很复杂,出了IX这种类型外还有XXX,和L这种情况。所以我们选择从高位按字符读取计算更加合适。同样的我们也可以采用压栈的方式进行计算,这种计算方法详见:栈的应用

我们举个例子,对于157这种数字,罗马字符表示为CLVII。我们读取第一个字符的时候压入栈中。然后继续读取是L,因为L<C所以不可能是左减的情况,只能是右加,所以我们用弹出C并+L然后压入栈中这时栈里是C+L=150,继续取V<L所以一样是右加类型弹栈压栈得155,之后一样最后得出157.perfect。

代码如下:(这里顺便说一下String类型的基础是char[]所以使用遍历的时间复杂度和数组是一样的)

public class RomantoInteger {
	public static void main(String[] args){
		String roman = "MCCXXXIV";
		try {
			System.out.println(method(roman));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	private static int method(String roman) throws Exception {
		// TODO Auto-generated method stub
		int stack = 0;
		int lastInt = 0;
		for(int i =0;i<roman.length();i++){
			int thisInt = getIntFromRoman(roman.charAt(i));
			if(thisInt>lastInt){//左减
				stack = stack-(lastInt<<1);
			}
			stack = stack+thisInt;
			lastInt = thisInt;
		}
		return stack;
	}
	private static int getIntFromRoman(char roman) throws Exception{//I(1),V(5),X(10),L(50),C(100),D(500),M(1000)。
		int a = 0;
		switch (roman) {
		case 'I':
			a= 1;
			break;
		case 'V':
			a= 5;
			break;
		case 'X':
			a= 10;
			break;
		case 'L':
			a= 50;
			break;
		case 'C':
			a= 100;
			break;
		case 'D':
			a= 500;
			break;
		case 'M':
			a= 1000;
			break;
		default:
			throw new Exception("含有非罗马字符");
		}
		return a;
	}
}
成功K.O


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值