标签搜索

罗马数字转整数问题

anker
2021-06-26 / 0 评论 / 9 阅读 / 正在检测是否收录...

非常简单的道题目,当作重温算法的第一碟小记录下。过程中其实也重新回忆下CPP语法

罗马数字转整数

#include <string>
#include <list>
#include <iostream>
using namespace std;

unsigned char2int(char v)
{
    switch (v)
    {
    case 'I':return 1; break;
    case 'V':return 5; break;
    case 'X':return 10; break;
    case 'L':return 50; break;
    case 'C':return 100; break;
    case 'D':return 500; break;
    case 'M':return 1000; break;
    default: return 0; break;
    }
}

unsigned has_prev(char cur, char prev)
{
    switch (cur)
    {
    case 'V':if(prev == 'I') return 4; break;// IV = 4
    case 'X':if(prev == 'I') return 9; break;// IX = 9
    case 'L':if(prev == 'X') return 40; break;// XL = 40
    case 'C':if (prev == 'X') return 90; break;;// XC = 90
    case 'D':if (prev == 'C') return 400; break;// CD = 400
    case 'M':if (prev == 'C') return 900; break;// CM = 900
    default:break;
    }
    return 0;
};
class Solution {
public:
    int romanToInt(string s) {
        int value = 0;
        size_t len = s.length();
        //cout << len << endl;
        int i = 0;
        while(i++ < len){
            char cur = s[len - i];
            int prev_idx = len - i - 1;
            if (prev_idx >= 0){
                int append = has_prev(cur, s[prev_idx]);
                if (append > 0) {
                    i++;
                    value += append;
                }else {
                    value += char2int(cur);
                }
            }else{
                value += char2int(cur);
            }
        }
        //cout << s << " to " << value << endl;
        return value;
    }
};

int main()
{
    Solution a;
    list<string> tests = { "LVIII", "IX", "MCMXCIV", "IV", "III"};
    for (list<string>::iterator itr = tests.begin(); itr != tests.end(); ++itr) {
        //std::cout << ' ' << *itr;
        int value = a.romanToInt(*itr);
        cout << *itr << " to " << value << endl;
    }
    
    system("pause");
    return 0;
0

评论 (0)

取消