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 map = new HashMap()
        {{
            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;
}
}
```

全部评论

相关推荐

11-01 20:03
已编辑
门头沟学院 算法工程师
Amazarashi66:这种也是幸存者偏差了,拿不到这个价的才是大多数
点赞 评论 收藏
分享
SinyWu:七院电话面的时候问我有没有女朋友,一听异地说你赶紧分。我:???
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务