13. Roman to Integer

10人阅读 评论(0) 收藏 举报

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

查看评论

LeetCode(13) RomanToInteger

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t...
  • feliciafay
  • feliciafay
  • 2013-12-11 10:42:45
  • 2803

leetcode-java-13. Roman to Integer

public class Solution { public int romanToInt(String s) { int len = s.length(); ...
  • github_34514750
  • github_34514750
  • 2016-06-02 17:09:11
  • 510

13. Roman to Integer [easy] (Python)

题目链接https://leetcode.com/problems/roman-to-integer/题目原文 Given a roman numeral, convert it to an in...
  • coder_orz
  • coder_orz
  • 2016-05-18 23:01:58
  • 1984

[LeetCode] 013. Roman to Integer (Easy) (C++/Java/Python)

[LeetCode] 013. Roman to Integer (Easy) (C++/Java/Python)
  • hcbbt
  • hcbbt
  • 2015-03-02 23:19:35
  • 3066

[LeetCode][13]Roman to Integer解析 罗马字符转int类型关于栈的常数实现-Java实现

Q: Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range...
  • u014629433
  • u014629433
  • 2016-06-14 10:36:50
  • 1840

[LeetCode]Roman to Integer,解题报告

前言 又是一个周末下午,每到周末可以和女友一起玩玩手机游戏做做体操还挺开心的,但是还是要多做题目保持写代码的感觉 题目 Given a roman numeral, convert it to...
  • zinss26914
  • zinss26914
  • 2013-12-01 20:46:29
  • 20034

LeetCode13——Roman to Integer

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from ...
  • booirror
  • booirror
  • 2015-01-27 17:51:09
  • 2554

(Java)LeetCode-13. Roman to Integer

Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from ...
  • u012848330
  • u012848330
  • 2016-05-10 23:27:14
  • 388

【LeetCode013算法/编程练习C++】Roman to Integer //难得击败了80%的人

罗马数字转整数int
  • zmdsjtu
  • zmdsjtu
  • 2016-12-29 19:37:13
  • 747

Integer to Roman (罗马数字转换) 【leetcode】

题目:Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range fr...
  • zhang9801050
  • zhang9801050
  • 2013-09-20 16:09:30
  • 17088
    个人资料
    等级:
    访问量: 25
    积分: 50
    排名: 179万+
    文章分类
    文章存档