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

Posted 胖子程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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


以上是关于[LeetCode][13]Roman to Integer解析 罗马字符转int类型关于栈的常数实现-Java实现的主要内容,如果未能解决你的问题,请参考以下文章

#Leetcode# 13. Roman to Integer

Leetcode 13. Roman to Integer(python)

Leetcode 13. Roman to Integer

Leetcode13 Roman To Integer

LeetCode13. Roman to Integer

LeetCode13. Roman to Integer