RomanToIntegerOPT [source code]

public class RomanToIntegerOPT {
    public int romanToInt(String s) {
    int nums[] = new int[s.length()];
    for (int i = 0; i < s.length(); i++) {
        switch (s.charAt(i)) {
            case 'M':
                nums[i]=1000;
                break;
            case 'D':
                nums[i]=500;
                break;
            case 'C':
                nums[i]=100;
                break;
            case 'L':
                nums[i]=50;
                break;
            case 'X' :
                nums[i]=10;
                break;
            case 'V':
                nums[i]=5;
                break;
            case 'I':
                nums[i]=1;
                break;
        }
    }
    int sum = 0;
    for (int i = 0; i < nums.length - 1; i++) {
        if (nums[i] < nums[i + 1]) sum -= nums[i];
        else sum += nums[i];
    }
    return sum + nums[nums.length - 1];
    }
}

这个是 submission 最优解, 88ms, 96%;

这个人对于这个逻辑看的比我清晰, 在他看来所有的 symbol 只分为两种, 要么是用来减的, 要么是用来加的. 这个逻辑比我的简单清晰很多;


这个是 discussion 里面一个年代比较久远的解:

public 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();  
    int count=0;  

   for(;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;      
}

虽然这个解不算特别快, 不过这个人的想法还是挺有意思的; 这个思路应该是最直接的一个思路了, 代码写起来也简单;

我感觉我没有想出这种代码, 还是对题目本身的个性的理解不够深刻, 太沉迷于 stream 类算法的框架里面了;


这个是一个不错的解:

public static int romanToInt(String s) {  
    int res = 0;  
    for (int i = s.length() - 1; i >= 0; i--) {  
        char c = s.charAt(i);  
        switch (c) {  
        case 'I':  
            res += (res >= 5 ? -1 : 1);  
            break;  
        case 'V':  
            res += 5;  
            break;  
        case 'X':  
            res += 10 * (res >= 50 ? -1 : 1);  
            break;  
        case 'L':  
            res += 50;  
            break;  
        case 'C':  
            res += 100 * (res >= 500 ? -1 : 1);  
            break;  
        case 'D':  
            res += 500;  
            break;  
        case 'M':  
            res += 1000;  
            break;  
        }  
    }  
    return res;  
}

只用一个 pass. 他的加减法的判断利用的是从右到左扫的过程中, 当前 symbol 是否比右侧目前的 sum 要大; 这个想法比较奇特;
不过感觉他这里的排除还不够彻底, 比如"VD" 这个应该是495, 他这个算法就解不出来; 不过这个想法还是很好的;
如果要改起来好像还是很麻烦, 就完全不如这里这个最优解了;


Problem Description

Given a roman numeral, convert it to an integer.

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

Difficulty:Easy
Category:Algorithms
Acceptance:45.20%
Contributor: LeetCode
Companies
microsoft bloomberg uber facebook yahoo
Related Topics
math string
Similar Questions
Integer to Roman

results matching ""

    No results matching ""