Fork me on GitHub

13.Roman to Integer


本人想法比较简单

class Solution {
 
	public int romanToInt(String s) {
		char arr[] = new char[s.length() + 1];//定义一个一维数组存放数据
		for (int i = 0; i < s.length(); i++) {//将输入的字符串遍历一遍
			arr[i] = s.charAt(i);
		}
		
		int sum = 0;
		for (int i = 0; i < s.length(); i++) {//判断一个或者两个罗马数字的所对应的值 并加上去
			if (arr[i] == 'M') {
				sum = sum+1000;
			} else if (arr[i] == 'C') {
				if (arr[i + 1] == 'M') {
					sum = sum+900;
					i++;
				} else if (arr[i + 1] == 'D') {
					sum = sum+400;
					i++;
				} else {
					sum = sum+100;
				}
			} else if (arr[i] == 'D') {
				sum = sum+500;
			} else if (arr[i] == 'X') {
				if (arr[i + 1] == 'C') {
					sum = sum+90;
					i++;
				} else if (arr[i + 1] == 'L') {
					sum = sum+40;
					i++;
				} else {
					sum = sum+10;
				}
			} else if (arr[i] == 'L') {
				sum = sum+50;
			} else if (arr[i] == 'I') {
				if (arr[i + 1] == 'X') {
					sum = sum+9;
					i++;
				} else if (arr[i + 1] == 'V') {
					sum = sum+4;
					i++;
				} else {
					sum = sum+1;
				}
			} else if (arr[i] == 'V') {
				sum =sum +5;
			}
		}
		return sum;
	}
	
}

其他大神的解法 我一步一步分析
case语句解法

public int romanToInt(String s) {
		int n = s.length();
		int roman_int = 0;
		for(int i=0;i<n;i++)
		{
			switch(s.charAt(i)) //定义一个case 语句块
			{
			case 'I' : roman_int = roman_int + 1;break;
			case 'V' : roman_int = roman_int + 5;break;
			case 'X' : roman_int = roman_int + 10;break;
			case 'L' : roman_int = roman_int + 50;break;
			case 'C' : roman_int = roman_int + 100;break;
			case 'D' : roman_int = roman_int + 500;break;
			case 'M' : roman_int = roman_int + 1000;break;
			default: System.out.println("default");break;
			}
 
			if(i!=0)
			{
				if(((s.charAt(i)=='V')||(s.charAt(i)=='X'))&&(s.charAt(i-1)=='I')) 
					roman_int = roman_int-1*2;
				if(((s.charAt(i)=='L')||(s.charAt(i)=='C'))&&(s.charAt(i-1)=='X'))
					roman_int = roman_int-10*2;
				if(((s.charAt(i)=='D')||(s.charAt(i)=='M'))&&(s.charAt(i-1)=='C'))
					roman_int = roman_int-100*2;
			}
		}
		return roman_int;
	}

hash码

class Solution 
{
    public int romanToInt(String s)
    {//制作一个hash表
        HashMap<Character, Integer> map = new HashMap<Character, Integer>()
        {{
            put('I', 1);
            put('V', 5);
            put('X', 10);
            put('L', 50);
            put('C', 100);
            put('D', 500);
            put('M', 1000);
        }};
        
        int sum = map.get(s.charAt(s.length() - 1));
        
        for(int i = s.length() - 2; i >= 0; i--)
        {
            if(map.get(s.charAt(i)) < map.get(s.charAt(i + 1)))
            {
                sum -= map.get(s.charAt(i));
            }
            else
            {
                sum += map.get(s.charAt(i));
            }
        }
        return sum;
    }
}
class Solution {
 
 public int letterToInteger(char letter) { 
  switch(letter) {
  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:return 0;
  }
 }
 
 public int romanToInt(String s) {  //解析罗马数字
String str = s.toUpperCase();
		char[] roman = str.toCharArray();
		int all = 0;
		int i = 0;
		while (true) {
			if (i >= roman.length - 1) {
				all += letterToInteger(roman[i]);
				break;
			}
			else if (i < roman.length - 1) {
				int currentNum = letterToInteger(roman[i]);
				int nextNum = letterToInteger(roman[i + 1]); // 越界!!! 仅输入一个 D 报错 已改
				if (currentNum >= nextNum) {
					all += (currentNum);
					i += 1;                                                       //一个一个加
				} else {
					all += (nextNum - currentNum); // 若当前字母比下一个字母小,则下一个字母表示数字减去当前字母表示的数字
					i += 2;
				}
				if (i == roman.length - 1) { // 如果下标已经移动到最后一位字母,那么all直接加上这个字母表示的数字
					all += letterToInteger(roman[roman.length - 1]);
					break; // 循环结束
				}
				if (i > roman.length - 1) // 如果下标已经超出字符组范围,循环结束
					break;
			}
		}
		return all;
	}
}
posted @ 2019-07-08 12:59  cznczai  阅读(83)  评论(0编辑  收藏  举报