【LC_Lesson4】---罗马数字到整数得转换
罗马数字包含以下七种字符: 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】---罗马数字到整数得转换的更多相关文章
- LeetCode 13 Roman to Integer(罗马数字转为整数)
题目链接 https://leetcode.com/problems/roman-to-integer/?tab=Description int toNumber(char ch) { switc ...
- [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 ...
- C#版 - Leetcode 13. 罗马数字转整数 - 题解
C#版 - Leetcode 13. 罗马数字转整数 - 题解 Leetcode 13. Roman to Integer 在线提交: https://leetcode.com/problems/ro ...
- 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 ,即 ...
- LeetCode - 13. 罗马数字转整数
1 题目描述 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I V X L C D M 例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 写做 XII , ...
- 整数转罗马数字以及罗马数字转整数(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 ...
- 【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 ,即为 ...
- 罗马数字转整数的golang实现
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I V X L C D M 例如, 罗马数字 2 写做 II ,即为两个并列的 1.12 写做 XII ,即为 X + ...
- 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 ...
随机推荐
- Python--day40--threading模块的几个方法
import time import threading #threading.get_ident() 查看当前进程号 def wahaha(n): time.sleep(0.5) print(n,t ...
- spring boot + thymeleaf 乱码问题
spring boot + thymeleaf 乱码问题 hellotrms 发布于 2017/01/17 15:27 阅读 1K+ 收藏 0 答案 1 开发四年只会写业务代码,分布式高并发都不会还做 ...
- 2018-2-13-win10-uwp-获取指定的文件-AQS
title author date CreateTime categories win10 uwp 获取指定的文件 AQS lindexi 2018-2-13 17:23:3 +0800 2018-2 ...
- linux主次编号
字符设备通过文件系统中的名子来存取. 那些名子称为文件系统的特殊文件, 或者设备文 件, 或者文件系统的简单结点; 惯例上它们位于 /dev 目录. 字符驱动的特殊文件由使用 ls -l 的输出的第一 ...
- dotnet 使用 Qpush 快速从电脑到手机推送文字
在手机打字总不是方便,于是就有了 Qpush 这个工具,通过这个工具可以快速从电脑到手机推送文字. 但是这个工具没有找到客户端,于是我就给他写了一个库,通过这个库可以快速进行开发 先介绍QPush 快 ...
- Eclipse GlassFish Server 配置
一.下载GlassFish Server 通过如下地址下载合适版本: http://glassfish.java.net/public/downloadsindex.html htt ...
- Find工具
Find工具主要用于操作系统文件.目录的查找, 1.语法参数格式为: Find工具的语法格式:find path(路径) -option(参数) action(动作): PATH路径:可以任意路径.绝 ...
- 基于python的二分搜索和例题
二分搜索 二分概念 二分搜索是一种在有序数组中查找某一特定元素的搜索算法. 搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束: 如果某一特定元素大于或者小于中间元素,则在数 ...
- 【温故知新】Java web 开发(四)JSTL 与 JDBC 的增删改查
本篇开始使用 jstl 这个 jsp 的标签库,在同一个 Servlet 中实现处理 CRUD 请求,以及使用 jdbc 数据库基本操作.然后你会发现 Servlet 和 jdbc 还是有很多不方便之 ...
- wide&deep模型演化
推荐系统模型演化 LR-->GBDT+LR FM-->FFM-->GBDT+FM|FFM FTRL-->GBDT+FTRL Wide&DeepModel (Deep l ...