罗马数字包含以下七种字符: 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. java线程与进程的比较

    线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元:而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任 ...

  2. maven环境隔离

    pom <build>节点下增加节点 <resources> <resource> <directory> src/main/resources.${d ...

  3. uni-app 生命周期函数

    应用生命周期 函数名 说明 onLaunch 当uni-app 初始化完成时触发(全局只触发一次) onShow 当 uni-app 启动,或从后台进入前台显示 onHide 当 uni-app 从前 ...

  4. 高可用之keepalived的配置文件详解

    ! Configuration File for keepalived global_defs { notification_email { acassen@firewall.loc failover ...

  5. java 基本数据类型的自动拆箱与装箱

    ——>  -128~127之间的特殊性.为什么要这样设计,好处? ——>  享元模式(Flyweight Pattern):享元模式的特点是,复用我们内存中已存在的对象,降低系统创建对象实 ...

  6. 2018百度之星初赛B - A,D,F

    总结:这一次的百度之星之行到这里也就结束了,充分的认识到了自己的不足啊...果然还是做的题太少,,见识的题型也还太少,对于STL的掌握还是不够到位啊!!(STL大法是真的好,建议大家认认真真的好好学学 ...

  7. Linux 字节序

    小心不要假设字节序. PC 存储多字节值是低字节为先(小端为先, 因此是小端), 一些高 级的平台以另一种方式(大端)工作. 任何可能的时候, 你的代码应当这样来编写, 它不在 乎它操作的数据的字节序 ...

  8. MobaXterm 使用中间服务器

    经常需要连接服务器,但是有时候服务器需要经过一层中间服务器才可以连接,所以本文告诉大家如何使用MobaXterm 配置中间服务器,进行ssh连接 在本文的开始,本地转发服务器已经弄好,本文不会告诉大家 ...

  9. C# dotnet 获取整个局域网的 ip 地址

    局域网可以使用的 IP 地址有很多,我写了一段代码用来枚举所有可以用的 ip 地址 小伙伴都知道,局域网可以使用的 IP 范围如下 A类地址:10.0.0.0 - 10.255.255.255 B类地 ...

  10. The first day of Crawler learning

    使用BeautifulSoup解析网页 Soup = BeautifulSoup(urlopen(html),'lxml') Soup为汤,html为食材,lxml为菜谱 from bs4 impor ...