LeetCode13 Roman to Integer 罗马转为数字

题目:

Given a roman numeral, convert it to an integer.

Input is guaranteed to be within the range from 1 to 3999.

翻译:把罗马转为数字

思路:如果是单纯的一个罗马字母比较好处理,但是对于4,9这样的,应该看它下一个字符代表的数字是不是比他大,要是大的话减去当前的字符代表的数字。要是小的话,则加上这个数字。

像IV ,代表4.当读到I的时候,应该判断下一个字符V和I的关系,V比I代表的数字大,所以此时应该加上V – I的值,然后指针跳过2.

代码1:

   public static int romanToInt(String s) {
		int num = 0;
		String roman[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
		int number[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
		int i = 0; int len = s.length();
		while(i < s.length())
		{
			
			if(i<s.length()-1&&(C2N(s.charAt(i))<C2N(s.charAt(i+1))))//@  1				
			{
				num+=C2N(s.charAt(i+1))-C2N(s.charAt(i));
				i+=2;
			}
			else 
			{
				num +=C2N(s.charAt(i));			
				i++;
			}
		}
		
		return num;
    }
    public static int C2N(char c)
	{
		switch (c) {
		case 'I':  return 1;
        case 'V':  return 5;
        case 'X':  return 10;
        case 'L':  return 50;
        case 'C':  return 100;
        case 'D':  return 500;
        case 'M':  return 1000;
        default:   throw new NumberFormatException(
                "Error");
		}
		
	}

在@1的地方,最初写的时候两个判断条件反着写。结果报错说是越界。后来找了一会才发现。

因为在&&判断的时候,如果前面的为假,后面可以直接跳过,但是如果前面已经报错,那后面的条件也不会看直接跳错。

又是细节的问题。唉

代码2:

 public int romanToInt(String s) {
	int num = 0;
		String roman[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
		int number[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
		int i = 0;
		while(i<=s.length()-1)
		{
			switch(s.charAt(i))
			{
				case 'I':
					if(i <s.length()-1&&(s.charAt(i+1)=='V'||s.charAt(i+1)=='X'))
						num -=1;
					else
						num += 1;
					break;
				case 'V':
					num +=5;
					break;
				case 'X':
					if(i < s.length()-1&&(s.charAt(i+1)=='L'||s.charAt(i+1)=='C'))
						num -=10;
					else
						num+=10;
					break;
				case 'L':
					num +=50;
					break;
				case 'C':
					if(i < s.length()-1&&(s.charAt(i+1)=='D'||s.charAt(i+1)=='M'))
						num -=100;
					else num+=100;
					break;
				case 'D':
					num+=500;
					break;
				case 'M':
					num+=1000;
					break;
				
			}
			i++;
		}
		return num;	
    }

直接把函数整合在一起的写法。看起来不是太简介。还是分开写成函数比较舒服。

点赞