标签:
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实现
标签:
原文地址:http://blog.csdn.net/u014629433/article/details/51669403