罗马数字包含以下七种字符: 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. Python--day40--threading模块的几个方法

    import time import threading #threading.get_ident() 查看当前进程号 def wahaha(n): time.sleep(0.5) print(n,t ...

  2. spring boot + thymeleaf 乱码问题

    spring boot + thymeleaf 乱码问题 hellotrms 发布于 2017/01/17 15:27 阅读 1K+ 收藏 0 答案 1 开发四年只会写业务代码,分布式高并发都不会还做 ...

  3. 2018-2-13-win10-uwp-获取指定的文件-AQS

    title author date CreateTime categories win10 uwp 获取指定的文件 AQS lindexi 2018-2-13 17:23:3 +0800 2018-2 ...

  4. linux主次编号

    字符设备通过文件系统中的名子来存取. 那些名子称为文件系统的特殊文件, 或者设备文 件, 或者文件系统的简单结点; 惯例上它们位于 /dev 目录. 字符驱动的特殊文件由使用 ls -l 的输出的第一 ...

  5. dotnet 使用 Qpush 快速从电脑到手机推送文字

    在手机打字总不是方便,于是就有了 Qpush 这个工具,通过这个工具可以快速从电脑到手机推送文字. 但是这个工具没有找到客户端,于是我就给他写了一个库,通过这个库可以快速进行开发 先介绍QPush 快 ...

  6. Eclipse GlassFish Server 配置

    一.下载GlassFish Server    通过如下地址下载合适版本:    http://glassfish.java.net/public/downloadsindex.html    htt ...

  7. Find工具

    Find工具主要用于操作系统文件.目录的查找, 1.语法参数格式为: Find工具的语法格式:find path(路径) -option(参数) action(动作): PATH路径:可以任意路径.绝 ...

  8. 基于python的二分搜索和例题

    二分搜索 二分概念 二分搜索是一种在有序数组中查找某一特定元素的搜索算法. 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束: 如果某一特定元素大于或者小于中间元素,则在数 ...

  9. 【温故知新】Java web 开发(四)JSTL 与 JDBC 的增删改查

    本篇开始使用 jstl 这个 jsp 的标签库,在同一个 Servlet 中实现处理 CRUD 请求,以及使用 jdbc 数据库基本操作.然后你会发现 Servlet 和 jdbc 还是有很多不方便之 ...

  10. wide&deep模型演化

    推荐系统模型演化 LR-->GBDT+LR FM-->FFM-->GBDT+FM|FFM FTRL-->GBDT+FTRL Wide&DeepModel (Deep l ...