zoukankan      html  css  js  c++  java
  • [leetcode 13]Roman to integer

    1 题目:

    Given a roman numeral, convert it to an integer.

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

    2 思路

    和上一道反过来,好吧,但是思路不一样。

    我写的代码思路一样,要考虑一些特殊情况,比较复杂。

    别人代码的思路倒是不错: 下面的那个思路,倒序遍历,如果大于5或50或500,那么就是减了,否则就是加。罗马数字小数字在左边是减,且仅限一位。

    https://leetcode.com/discuss/2369/solution-for-this-question-but-dont-know-there-any-easier-way

    这个是用 哈希函数实现的,我也想过用哈希函数,但是不是这样的,我想的是那个数组全部哈希一遍- -。

    https://leetcode.com/discuss/23778/my-accepted-java-code-280-310ms

    3 代码:

    我的

     public int romanToInt(String s) {
            String[] M = {"","M","MM","MMM"};
            String[] C = {"","C","CC","CCC","D","CD","DC","DCC","DCCC","CM"};
            String[] X = {"","X","XX","XXX","L","XL","LX","LXX","LXXX","XC"};
            String[] V = {"","I","II","III","V","IV","VI","VII","VIII","IX"};
            int num = 0;
            for(int i = M.length-1; i>=0 ; i--){
                if(s.startsWith(M[i])){
                    num = num + i*1000;
                    s = s.substring(i);
                    break;
                }
            }
            
            for(int j = C.length-1; j>=0; j--){
                if(s.startsWith(C[j])){
                     s = s.substring(C[j].length());
              //5和4要反过来,先检测CD再检测D,反之,就检测不到D了
    if(j==5) j = 4; else if( j==4) j=5; num = num + j*100; break; } } for(int k = X.length-1; k>=0;k--){ if(s.startsWith(X[k])){ s = s.substring(X[k].length()); if(k==5) k = 4; else if( k==4) k=5; num = num + k*10; break; } } for(int i = V.length-1; i>=0; i--){ if(s.startsWith(V[i])){ if(i==5) i = 4; else if( i==4) i=5; num = num + i; break; } } return num; }

    好的思路:

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

    哈希函数:

    public class Solution {
        private static final Map<Character, Integer> maps = new HashMap<>();
        static{
            maps.put('I', 1);
            maps.put('V', 5);
            maps.put('X', 10);
            maps.put('L', 50);
            maps.put('C', 100);
            maps.put('D', 500);
            maps.put('M', 1000);
        }
    
        public int romanToInt(String s) {
            int previousNum = maps.get(s.charAt(0));
            int result = maps.get(s.charAt(0));
    
            for (int i = 1; i < s.length(); i++){
                if (previousNum < maps.get(s.charAt(i))){
                        result = result - (2*previousNum);
                } 
    
                previousNum = maps.get(s.charAt(i));
                result += previousNum;
            }
            return result;
        }
    }
  • 相关阅读:
    IntlliJ IDEA 注册码获取或离线破解
    selenium元素定位
    appium元素定位
    django模型之meta使用
    django 之admin使用
    django之models模块使用
    Django的httprequest对象和httpresponse对象
    parameterized之unittest参数化
    HTMLTestRunner不生成报告
    collections之python基本应用
  • 原文地址:https://www.cnblogs.com/lingtingvfengsheng/p/4567207.html
Copyright © 2011-2022 走看看