您的位置:首页 > 编程语言 > Java开发

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

2016-06-14 10:36 603 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: