罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

  字符 数值
  I 1
  V 5
  X 10
  L 50
  C 100
  D 500
  M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

  I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
  X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 
  C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

示例 1:

输入: "III"
输出: 3

示例 2:

输入: "IV"
输出: 4

一. 题目分析

该题难点:

  1)  对于特殊情况得判断,

  2)对于复杂输入以及非法输入得判断

方案一(C++实现):

  构建一个字典表,存储罗马数据与数值,然后遍历该数值,将每个罗马字符所代表得数值依次相加即可,重点在于六种特殊情况得判断。代码如下:

 class Solution {
public:
int romanToInt(string RomanStr) {
int index = ;
int ans = ;
map <char, int> table = {
{'I',},
{'V',},
{'X',},
{'L',},
{'C',},
{'D',},
{'M',}
};
while(RomanStr[index] != '\0')
{
int key_i = ;
switch(RomanStr[index])
{
case 'I':
switch(RomanStr[index+])
{
case 'V':
ans += ;
index += ;
continue;
case 'X':
ans += ;
index += ;
continue;
}
case 'X':
switch(RomanStr[index+])
{
case 'L':
ans += ;
index += ;
continue;
case 'C':
ans += ;
index += ;
continue;
}
case 'C':
switch(RomanStr[index+])
{
case 'D':
ans += ;
index += ;
continue;
case 'M':
ans += ;
index += ;
continue;
}
default:
;
}
ans += table[RomanStr[index]];
index++;
}
return ans;
}
};

如上是我自己写得代码,LeetCode上也能运行通过,但有以下问题:

  1) 针对一些复杂输入时,可能出现错误得错过,而且没有对输入得罗马字符串进行合理性判断,这个是需要吗?打个问号?

  2)接上面问题,如果出现ICM这种格式得数据,怎么结合呢?如果输入"IDM",这样得数据是否合理呢?

方案二:

参考了别人从数学原理得计算方法,改进了下方案:

本质上采用得思想是,判断当前数据与下一个数据得大小,如果小于,则加上前一个数据得负值。目前看来该种方法是比较简单得方式,逻辑简单清晰。但同样有上述有疑问:对于某些复杂输入得判断如何进行

 class Solution {
public:
int romanToInt(string RomanStr) {
map <char, int> table = {
{'I',},
{'V',},
{'X',},
{'L',},
{'C',},
{'D',},
{'M',}
};
int ans = ;
for(int index=; index<RomanStr.size(); index++)
{
if (table[RomanStr[index]] < table[RomanStr[index+]])
{
ans -= table[RomanStr[index]];
}
else
ans += table[RomanStr[index]];
}
printf("ans = %d\n",ans);
return ans;
}
};

二. 总结分析

  1) 学习到了一种方法,在碰到一个题目,更多得查看其在数学上得规律与原理,而不是宏观得跟随着变化去解题

  2) 学到了C++中对Hash表得一种使用方法,即通过map来简历数据表

  3) while()循环中遇到switch时,如果条件符合跳过循环,直接使用continue即可,break生效得时switch,而continue生效得时while

												

【LC_Lesson4】---罗马数字到整数得转换的更多相关文章

  1. LeetCode 13 Roman to Integer(罗马数字转为整数)

    题目链接 https://leetcode.com/problems/roman-to-integer/?tab=Description   int toNumber(char ch) { switc ...

  2. [Swift]LeetCode13. 罗马数字转整数 | Roman to Integer

    Roman numerals are represented by seven different symbols: I, V, X, L, C, D and M. Symbol Value I 1 ...

  3. C#版 - Leetcode 13. 罗马数字转整数 - 题解

    C#版 - Leetcode 13. 罗马数字转整数 - 题解 Leetcode 13. Roman to Integer 在线提交: https://leetcode.com/problems/ro ...

  4. Leetcode#13. Roman to Integer(罗马数字转整数)

    题目描述 罗马数字包含以下七种字符:I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即 ...

  5. LeetCode - 13. 罗马数字转整数

    1 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I V X L C D M 例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 写做 XII , ...

  6. 整数转罗马数字以及罗马数字转整数(java实现)

    题目: 1.罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II  ...

  7. 【LeetCode】13. 罗马数字转整数

    题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为 ...

  8. 罗马数字转整数的golang实现

    罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I V X L C D M 例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 写做 XII ,即为 X + ...

  9. LeetCode题库13. 罗马数字转整数(c++实现)

    问题描述: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II  ...

随机推荐

  1. 解决vscode电脑卡顿问题

    在安装了vscode之后,发现电脑很卡,cpu使用率高达100%. 解决方法1: 打开vscode之后,点击文件==>首选项==>设置搜索设置search.followSymlinks然后 ...

  2. jQuery 选择器 bug

    $(function(){ $(".menu li").hide(); //目标对象(一定要用class或id选择器)绑定函数 $(".menu").click ...

  3. CF1055F Tree and XOR

    CF1055F Tree and XOR 就是选择两个数找第k大对儿 第k大?二分+trie上验证 O(nlognlogn) 直接按位贪心 维护可能的决策点(a,b)表示可能答案的对儿在a和b的子树中 ...

  4. P1011 圆柱体的表面积

    题目描述 输入底面半径 \(r\) 和高 \(h\) ,输出圆柱体的表面积,保留 \(3\) 位小数. 输入格式 输入包含两个实数 \(r,h(1 \le r,h \le 1000)\) 且保证输入的 ...

  5. WPF 托盘显示

    本文告诉大家如何在 WPF 实现在托盘显示,同时托盘可以右击打开菜单,双击执行指定的代码 NotifyIcon WPF 通过 Nuget 安装 Hardcodet.NotifyIcon.Wpf 可以快 ...

  6. 一次接口压力测试qps极低原因分析及解决过程

    一次接口压力测试qps极低原因分析及解决过程 9-2日在做内部的性能测试相关培训时,发现注册接口压力测试qps极低(20左右),这个性能指标远不能达到上线标准 ,经过一系列调试,最后定位 98%的时间 ...

  7. H3C 使用tracert命令

  8. 实现页面查看xml或json数据类似控制台效果

    在前端查看xml或者json数据时,实现在类似与控制台中console的效果. 配合Ant Design的Collapse折叠面板进行展示. Collapse组件的地址:https://ant.des ...

  9. 2019牛客多校第二场 A Eddy Walker(概率推公式)

    2019牛客多校第二场 A Eddy Walker(概率推公式) 传送门:https://ac.nowcoder.com/acm/contest/882/A 题意: 给你一个长度为n的环,标号从0~n ...

  10. 【Linux】grep笔记

    Linux grep命令用于查找文件里符合条件的字符串. 参数: -a 或 --text : 不要忽略二进制的数据. -A<显示行数> 或 --after-context=<显示行数 ...