• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

每日leecode-Integer to Roman

leetcode admin 4年前 (2016-04-24) 1266次浏览 0个评论 扫描二维码

罗马数字的计数规则

  1. 相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
  2. 小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
  3. 小的数字、(限于 Ⅰ、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
  4. 正常使用时、连写的数字重复不得超过三次;
  5. 在一个数的上面画一条横线、表示这个数扩大 1000 倍

代码实现:

百度百科给的答案:

该答案通过建表的方式把所有的可能出现的异常点全部包含进来,然后查表实现。

比如 9,答案应该是 IX,如果正常处理就要考虑跟 1,5,10 之间的关系,需要写相关的判定,一定程度上增加了代码量

class Solution {
public:
    string intToRoman(int num) {
        char* c[4][10]={
            {"","I","II","III","IV","V","VI","VII","VIII","IX"},
            {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
            {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
            {"","M","MM","MMM"}
        };
        string roman;
        roman.append(c[3][num / 1000 % 10]);
        roman.append(c[2][num / 100 % 10]);
        roman.append(c[1][num / 10 % 10]);
        roman.append(c[0][num % 10]);
         
        return roman;
    }
};
 

leetcode 提交的代码:

class Solution {
public:
    void setDigit(string &res, int n, char a, char b, char c) {
         if (n < 4) 
         {
            for (int i = 0; i < n; ++i) 
            {   
              res.push_back(a);             
            }         
         }         
         if (n == 4)
         {            
            res.push_back(a);             
            res.push_back(b);        
         }         
         if (n == 5) 
           res.push_back(b);         
         if (n > 5 && n < 9) 
         {
            res.push_back(b);
            for (int i = 5; i < n; ++i) {
                res.push_back(a);
            }
        }
        if (n == 9) {
            res.push_back(a);
            res.push_back(c);
        }
    }
    string intToRoman(int num) {
        int t = (num / 1000) % 10, h = (num / 100) % 10, d = (num / 10) % 10, n = num % 10;
        string res;
        setDigit(res, t, 'M', '?', '?');
        setDigit(res, h, 'C', 'D', 'M');
        setDigit(res, d, 'X', 'L', 'C');
        setDigit(res, n, 'I', 'V', 'X');
        return res;
    }
};

Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明每日 leecode-Integer to Roman
喜欢 (3)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!