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

    首先要知道罗马数字的表示法,百度百科的解释是:

      基本字符:
      I、V、X、L、C、D、M
      相应的阿拉伯数字表示为:
      1、5、10、50、100、500、1000
    1. 相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
    2. 小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
    3. 小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
    4. 正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外)
    5. 在一个数的上面画一条横线,表示这个数扩大1000倍。

    需要一个map获取每个基本字符到数字的映射。通过观察上面可知,要获得罗马数字的表示,可从前至后遍历每一个字符,比较每一个字符和后一个字符的大小,如果前一个字符大于等于后一个字符的话,就在总数里加上这个数;如果前一个字符小于后一个字符,就在总数里加上后一个字符减掉前一个字符的结果。复杂度为O(n)。

        int getIndex(char input){
            switch(input){
                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;
            }
        }
    int romanToInt(string s){
        int len = s.length();
        int i;
        int tmp1, tmp2;
        int result = 0;
        for(i = 0;i < len-1; i++){
            tmp1 = getIndex(s[i]);
            tmp2 = getIndex(s[i+1]);
            if(tmp1 >= tmp2)
                result += tmp1;
            else{
                result += (tmp2 - tmp1);
                i++;
            }
        }
        if(i == len-1)
            result += getIndex(s[len-1]);
        return result;
    }
  • 相关阅读:
    003_cd pushd popd三个命令的区别
    002_更新Nginx证书
    001_nginx常用参数查询
    001_shell经典案例
    001_chrome工具详解
    002_分布式搜索引擎Elasticsearch的查询与过滤
    004_加速国内docker源下载速度
    dango models and database ---- relation ship
    dango models and database ---- verbose name
    MySQL字符集详解
  • 原文地址:https://www.cnblogs.com/waruzhi/p/3332238.html
Copyright © 2011-2022 走看看