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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值