13. Roman to Integer

1.问题描述

Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M.
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
For example, two is written as II in Roman numeral, just two one’s added together. Twelve is written as, XII, which is simply X + II. The number twenty seven is written as XXVII, which is XX + V + II.
Roman numerals are usually written largest to smallest from left to right. However, the numeral for four is not IIII. Instead, the number four is written as IV. Because the one is before the five we subtract it making four. The same principle applies to the number nine, which is written as IX. There are six instances where subtraction is used:
• I can be placed before V (5) and X (10) to make 4 and 9.
• X can be placed before L (50) and C (100) to make 40 and 90.
• C can be placed before D (500) and M (1000) to make 400 and 900.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
Example 1:
Input: “III”
Output: 3
Example 2:
Input: “IV”
Output: 4
Example 3:
Input: “IX”
Output: 9
Example 4:
Input: “LVIII”
Output: 58
Explanation: C = 100, L = 50, XXX = 30 and III = 3.
Example 5:
Input: “MCMXCIV”
Output: 1994
Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.

来自 https://leetcode.com/problems/roman-to-integer/description/

2.题目分析

题目要求把罗马数字转换成阿拉伯数字,首先我们先来看看什么是罗马数字,题目中已经给出了具体的计数方法的描述。我们先分析这个罗马数字的字符串,这个字符串可以划分为千位,百位,十位,个位,读出千位后,后面紧接着就是百位了,以此类推。我的想法就是建一个二维的表,分别存储个位,十位,百位,千位。先从千位找起,找到后再找百位,然后十位,个位,找到的条件是查找的起点和find函数的的返回一致(比如4-IV 和5-v,当我们拿v去匹配时会找到iv才结束,因此不能用find()!=-1)。每找到一个,我们就要更新下一次查找的字符串的起点。

3.C++代码

//我的代码:(beats 34%)
int romanToInt(string s)
{
    //对照表
    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" }
    };
    int res = 0;//
    int i = 3;
    int j = 3;
    int flag = 0;
    for ( i; i >= 0; i--)
    {
        for ( j ; j > 0; j--)
        {
            if (s.find(c[i][j],flag) == flag)//在起点处找到匹配的
            {
                res += j*pow(10, i);
                string tmp_str = c[i][j];
                flag+=tmp_str.length();//更新下一次查找的起点
                break;
            }
        }
        j = 9;
    }       
    return res;
}
//讨论区比较好的方法
int romanToInt2(string s)
{
    int res = 0;
    for (int i = s.length() - 1; i >= 0; i--)
    {
        switch (s[i])
        {
            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;
}
//附加阿拉伯转罗马数字
string  intTointroman(int nums)
{
    string s;
    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" }
        };
    s.append(c[3][nums / 1000]);
    s.append(c[2][nums % 1000 / 100]);
    s.append(c[1][nums % 100 / 10]);
    s.append(c[0][nums % 10]);
    return s;
}

4.相关知识点

string类:
https://blog.csdn.net/hero_myself/article/details/52313617

猜你喜欢

转载自blog.csdn.net/qq_29689907/article/details/79972441