「Leetcode」13. Roman to Integer(Java)

分析

把具体的情况一个一个实现即可,没有什么幺蛾子。

代码

class Solution {
    public int romanToInt(String s) {
        int ans = 0;
        for (int i=0; i!=s.length(); ++i)
        {
            switch(s.charAt(i))
            {
                case 'I':
                    if(i<s.length()-1 && 
                      (s.charAt(i+1)=='X' || s.charAt(i+1)=='V'))
                    {
                        ans--; 
                        break;
                    }
                    ans++;
                    break;
                case 'V':
                    ans+=5;
                    break;
                case 'X':
                    if(i<s.length()-1 &&
                      (s.charAt(i+1)=='L' || s.charAt(i+1)=='C'))
                    {
                        ans-=10;
                        break;
                    }
                    ans+=10;
                    break;
                case 'L':
                    ans+=50;
                    break;
                case 'C':
                    if(i<s.length()-1 &&
                      (s.charAt(i+1)=='D' || s.charAt(i+1)=='M'))
                    {
                        ans-=100;
                        break;
                    }
                    ans+=100;
                    break;
                case 'D':
                    ans+=500;
                    break;
                case 'M':
                    ans+=1000;
                    break;
                default: break;
            }
        }
        return ans;
    }
}

更好的代码

精彩的代码就是能够把所表达的意思用更少的代码跑更快的速度。以下代码无疑实现了这个目标:

class Solution {
    
    public static int romanToInt(String s) {
        int num = 0;
        int n = s.length();
        
        for (int i = 0; i < n-1; i++) {
            int curr = map(s.charAt(i));
            int next = map(s.charAt(i+1));
            num = curr < next ? num - curr : num + curr;
        }
        
        num += map(s.charAt(n-1));
        
        return num;
    }
    
    private static int map(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: return 0;
        }
    }   
}
posted @ 2019-02-10 00:45  ISoLT  阅读(189)  评论(0编辑  收藏  举报