[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

代码如下:(这里顺便说一下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;ilastInt){//左减
				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


你可能感兴趣的:(LeetCode,LeetCode,LeetCode,栈的应用,Roman,to,Integer,时间复杂度为常数)