欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

13. 罗马数字转整数

程序员文章站 2023-12-27 18:36:27
...

 

罗马数字包含以下七种字符  I:  V,  X,  LC, ,D 和  M

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如,罗马数字2写做  II ,即为两个并列的1.12写做  XII ,即为  X +  II 27写做   XXVII,即为  XX +  V +  II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做  IIII,而是  IV。数字1在数字5的左边,所表示的数等于大数5减小数1得到的数值4.同样地,数字9表示为  IX。这个特殊的规则只适用于以下六种情况:

  • I 可以放在  V (5)和  X (10)的左边,来表示4和9。
  • X 可以放在  L (50)和  C (100)的左边,来表示40和90。 
  • C 可以放在  D (500)和  M (1000)的左边,来表示400和900。

给定一个罗马数字,将其转换成整数。输入确保在1到3999的范围内。

示例1:

输入: "III"
输出: 3

示例2:

输入: "IV"
输出: 4

示例3:

输入: "IX"
输出: 9

示例4:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

 

直接暴力**

class Solution {
    public int romanToInt(String s) {
        char[] cs = s.toCharArray();
		int sum = 0;
		for(int i = 0;i < cs.length; i++){
			if(i<cs.length-1){
				switch (cs[i]) {
				case 'I':
					if (cs[i+1] == 'V') {
						sum = sum + 4;
						i++;
					}else if (cs[i+1] == 'X') {
						sum = sum + 9;	
						i++;
					}else {
						sum = sum +1;
					}
					break;
				case 'V':
					sum = sum +5;
					break;
				case 'X':
					if (cs[i+1] == 'L') {
						sum = sum + 40;
						i++;
					}else if (cs[i+1] == 'C') {
						sum = sum + 90;	
						i++;
					}else {
						sum = sum +10;
					}
					break;
				case 'L':
					sum = sum+50;
					break;
				case 'C':
					if (cs[i+1] == 'D') {
						sum = sum + 400;
						i++;
					}else if (cs[i+1] == 'M') {
						sum = sum + 900;	
						i++;
					}else {
						sum = sum +100;
					}
					break;
				case 'D':
					sum = sum+500;
					break;
				case 'M':
					sum = sum+1000;
					break;
				}
			}else{
				switch (cs[i]) {
				case 'I':
						sum = sum +1;
					break;
				case 'V':
					sum = sum +5;
					break;
				case 'X':
						sum = sum +10;
					break;
				case 'L':
					sum = sum+50;
					break;
				case 'C':
						sum = sum +100;
					break;
				case 'D':
					sum = sum+500;
					break;
				case 'M':
					sum = sum+1000;
					break;
				default:
					break;
				}
			}			
		}
		return sum;
    }
}

使用HashMap的函数,如果右边的数字比左边的大,说明应该两个罗马数字是一体,应该一起算。 

class Solution {
    public int romanToInt(String s) {
       char[] cs = s.toCharArray();
		int sum = 0;
		HashMap<Character,Integer> map = new HashMap<Character,Integer>();
		map.put('I', 1);
		map.put('V', 5);
		map.put('X', 10);
		map.put('L', 50);
		map.put('C', 100);
		map.put('D', 500);
		map.put('M', 1000);
    	for(int i=0; i<cs.length;i++){
			int val = map.get(cs[i]);
			if (i == cs.length -1 || map.get(cs[i+1]) <= map.get(cs[i])) {
				sum +=val;
			}else {
				sum -=val;
			}
		}
		return sum; 
    }
}

 

相关标签: Leetcode

上一篇:

下一篇: