13. Roman to Integer

試著忘記壹切 提交于 2019-11-29 10:25:01

题目描述(简单难度)

在这里插入图片描述
题目描述:和上12题恰好相反,本题是将将罗马数字转换成阿拉伯数字

解法一

其实这种解法具有先验知识。
如果我们输入的罗马数字没有特殊情况,就直接转换为对应的阿拉伯数字。
那么什么时候会出现特殊情况呢?
就是当4,9,40,90,400,900这几种情况出现时,要相对应减去一定的值,再按照正常的结果进行转换。

public class Roman_to_Integer {
	public static int romantoint(String s) {
		int sum=0;
		if(s.indexOf("IV")!=-1) {sum-=2;}//求元素索引
		if(s.indexOf("IX")!=-1){sum-=2;}
	    if(s.indexOf("XL")!=-1){sum-=20;}
	    if(s.indexOf("XC")!=-1){sum-=20;}
	    if(s.indexOf("CD")!=-1){sum-=200;}
	    if(s.indexOf("CM")!=-1){sum-=200;}
		
		char[] c=s.toCharArray();//字符串转换为数组
		for(int count=0;count<=s.length()-1;count++) {
			if(c[count]=='M') sum+=1000;
			if(c[count]=='D') sum+=500;
			if(c[count]=='C') sum+=100;
			if(c[count]=='L') sum+=50;
			if(c[count]=='X') sum+=10;
		    if(c[count]=='V') sum+=5;
		    if(c[count]=='I') sum+=1;
		}
		return sum;
	}
	public static void main(String srgs[]) {
		String s="CDL";
		int ans=romantoint(s);
		System.out.println(ans);
	}
}

时间复杂度:O(1)。

空间复杂度:O(1)。

解法二

利用到罗马数字的规则,一般情况是表示数字大的字母在前,数字小的字母在后,如果不是这样,就说明出现了特殊情况,此时应该做减法。

public class Roman_to_Integer2 {
	public static int getval(char c) {
		switch(c) {
			case 'M':
				return 1000;
			case 'D':
				return 500;
			case 'C':
				return 100;
			case 'L':
				return 50;
			case 'X':
				return 10;
			case 'V':
				return 5;
			case 'I':
				return 1;
	}
		throw new IllegalArgumentException("unsupported character");
	}
	
	public static int romantoint(String s) {
		int res=0;
	
		for(int i=0;i<s.length()-1;i++) {
			int cur=getval(s.charAt(i));
			int next=getval(s.charAt(i+1));
			if(cur<next) {
				res-=cur;
			}else {
				res+=cur;
				}
			}
		return res+getval(s.charAt(s.length()-1));
			
		}
	public static void main(String args[]) {
		String s="CDL";
		int ans=romantoint(s);
		System.out.println(ans);
		}
}

时间复杂度:O(1)。

空间复杂度:O(1)。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!