zoukankan      html  css  js  c++  java
  • Roman to Integer

    Given a roman numeral, convert it to an integer.

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

    Subscribe to see which companies asked this question

    按照intger to roman 的思路,写下面这道题,比较绕, 而且写的不够简洁,而且修改了好几次

    class Solution {
    public:
        int romanToInt(string s) {
            string c[4][10]={{"0","I","II","III","IV","V","VI","VII","VIII","IX"},
                             {"0","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
                             {"0","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
                             {"0","M","MM","MMM"}};
    
            int len = s.length();
            if (0 == len) {
                return 0;
            }
            int begin = 0;
            int i;
            int res = 0;
            while (begin < len) {
                if (s[begin] == 'M') {
                    for (i=3; i>0; i--) {
                        if (s.find(c[3][i]) != string::npos) {
                            res += i * 1000;
                            begin = begin + c[3][i].length();
                            break;
                        }
                    }
                } else if (s[begin] == 'C' || s[begin] == 'D') {
                    for (i=9; i>0; i--) {
                        if (s.find(c[2][i]) != string::npos) {
                            //当找到D的时候,并不能够确定是找到CD 还是D
                            //做一下判断
                            if (begin >=0 && s[begin] == 'C' && s[begin + 1] == 'D') {
                                res += 4 * 100;
                                begin = begin + c[2][4].length();
                                break;
                            } else {
                                res += i * 100;
                                begin = begin + c[2][i].length();
                                break;
                            }
                        }
                    }
                } else if (s[begin] == 'X' || s[begin] == 'L') {
                    for (i=9; i>0; i--) {
                        if (s.find(c[1][i]) != string::npos) {
                            if (begin >=0 && s[begin] == 'X' && s[begin + 1] == 'L') {
                                res += 4 * 10;
                                begin = begin + c[1][4].length();
                                break;
                            } else {
                                res += i * 10;
                                begin = begin + c[1][i].length();
                                break;
                            }
                        }
                    }
                } else if (s[begin] == 'I' || s[begin] == 'V') {
                    for (i=9; i>0; i--) {
                        if (s.find(c[0][i]) != string::npos) {
                            if (begin >=0 && s[begin] == 'I' && s[begin + 1] == 'V') {
                                res += 4 ;
                                begin = begin + c[0][4].length();
                                break;
                            } else {
                                res += i;
                                begin = begin + c[0][i].length();
                                break;
                            }
                        }
                    }
                } else {
                    return res;
                }
            }
            return res;
        }
    };

    如果按照下面这种思路写就很简单了

    class Solution {
    public:
        int romanToInt(string s) {
            map<char,int> roman;
            roman['I']=1;
            roman['V']=5;
            roman['X']=10;
            roman['L']=50;
            roman['C']=100;
            roman['D']=500;
            roman['M']=1000;
    
            int len = s.length();
            if (0 == len) {
                return 0;
            }
    
            int res = 0;
            int index;
            for (index=0; index<len; index++) {
                if (index>0 && roman[s[index]] > roman[s[index -1]]) {
                    res = res + (roman[s[index]] -2 * roman[s[index -1]]);
                } else {
                    res = res + roman[s[index]];
                }
            }
    
            return res;
        }
    
    };
  • 相关阅读:
    输入adb shell 时 提示error: more than one device and emulator
    增加 addDataScheme("file") 才能收到SD卡插拔事件的原因分析 -- 浅析android事件过滤策略
    Android音乐编程:管理音频焦点
    Android MediaScanner 详尽分析
    MediaScanner与音乐信息扫描==
    Vold工作流程分析学习
    [LeetCode] Majority Element II
    Android 四大组件学习之ContentProvider五
    HDU 1171 Big Event in HDU(01背包)
    Atom编辑器折腾记_(15)JS代码片段补全(插件:javascript-snippets)
  • 原文地址:https://www.cnblogs.com/SpeakSoftlyLove/p/5097151.html
Copyright © 2011-2022 走看看