LeetCodeOJ刷题之13【Roman to Integer】
Roman to Integer
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
意思就是:
给出一个罗马数字,返回其对应的整数 num( 0<=num<=3999)表示;
罗马数字范围从 0-->3999
罗马数字有:
I | V | X | L | C | D | M |
---|---|---|---|---|---|---|
1 | 5 | 10 | 50 | 100 | 500 | 1000 |
Solutions
-
- 这种方法是对罗马数字从头到尾的扫描一遍。分析一下可以知道,只有 4 和 9 才会出现小一点的罗马数字出现在大的罗马数字的前面!比如:
CD=400
其中C=100 , D=500
,此时需要的后一个罗马数字减去前面一个罗马数字,其他情况都是一直加的。代码如下:
class Solution {
public:
int romanToInt(string s) {
int idx=0,n=s.length();
if(s.length()<=0)return 0; string roman="IVXLCDM";
int nums[] ={1,5,10,50,100,500,1000};
int res=0;
//idx=roman.find(s.at(0));
//if(idx<0||idx>6)return 0;
//if(n==1){
//return nums[idx];
//}
int num1,num2;
idx=0;
while(idx<n-1){ // 需要考虑 idx+1 的越界情况
num1=roman.find(s[idx]);
num2=roman.find(s[idx+1]);
if(num2>num1){
res=res+(nums[num2]-nums[num1]);
idx+=2;
}else{
res=res+nums[num1];
++idx;
}
}
if(n-1==idx){ //需要考虑可能剩下的最后一个罗马数字
num1=roman.find(s[n-1]);
res+=nums[num1];
}
return res;
}
}; - 这种方法是对罗马数字从头到尾的扫描一遍。分析一下可以知道,只有 4 和 9 才会出现小一点的罗马数字出现在大的罗马数字的前面!比如:
-
- 方案1中需要考虑 idx+1 的越界情况,所以还要在最后再增加一个判断,且使用的是从前向后扫描罗马数字字串;那如果是从后向前扫描罗马数字字串呢?思想会不会简单一点呢?分析一下可以看出,从后向前扫描,可以一直加下去,除了一种情况:当前扫描的数小于上一个扫描的数!也就是说只有这一个条件了,不需要再判断什么越不越界的问题了。如:
MCMVI=1906
, 扫描V
时V>I
(在罗马数字中,以下同),所以直接加,结果为:6,扫描M
也一样,结果为1006,接下来扫描到C
,此时C<M
,所以应是减去C
,结果是906,最后再加M
,得到结果:1906。要做的,只是记录下上一次的罗马数字。代码如下:
class Solution {
public:
int romanToInt(string s) {
if(s.length()<=0)return 0;
string roman="IVXLCDM";
int nums[] ={1,5,10,50,100,500,1000};
int n=s.length();
int res=0, idx=n-1, pre=0, ndx;
while(idx>=0){
ndx=roman.find(s[idx]);
if(pre>ndx){
res-=nums[ndx];
}else{
res+=nums[ndx];
}
pre=ndx;
--idx;
}
return res;
}
};
- 方案1中需要考虑 idx+1 的越界情况,所以还要在最后再增加一个判断,且使用的是从前向后扫描罗马数字字串;那如果是从后向前扫描罗马数字字串呢?思想会不会简单一点呢?分析一下可以看出,从后向前扫描,可以一直加下去,除了一种情况:当前扫描的数小于上一个扫描的数!也就是说只有这一个条件了,不需要再判断什么越不越界的问题了。如:
-
- 查阅了网友的解答,发现这一个方式挺好的,思路也很简单:
- 逐个遍历罗马数字串,根据当前遍历到的字符,进行对应的累加操作。
- 罗马数字共 7 个符号,
IVXLCDM
,如果遍历到罗马数字 w ,则判断之前已经求出的数字 res 是否小于 w ,如果小于,则 加上 w :res=res+w
,否则减去 w 。原因是:因为是从后向前遍历,所以我们已经遍历出来的数字肯定是会小于下一进位的数字的,比如 189 ,89再大,也没有100大!所以此算法使用的就是这种思想,一旦出现违法了这种情况,那就是出现了 4 或者 9 的情况。说明我们加多了,那就要减去。说的可能比较不好完全理解,看代码:
class Solution {
public:
int romanToInt(string s) {
int res = 0 ,n=s.length();
for (int i = n - 1; i >= 0; --i) {
char c = s.at(i);
switch (c) {
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;
}
};
- 查阅了网友的解答,发现这一个方式挺好的,思路也很简单:
看了一下其他的代码,大致的思想都是上面的方法,可能还有我没发现的。只是代码编写的形式不同而已。
附录
同系列:LeetCodesOJhttp://www.cnblogs.com/lomper/tag/LeetCodesOJ/
LeetCodeOJ刷题之13【Roman to Integer】的更多相关文章
- 【leetcode刷题笔记】Roman to Integer
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...
- leetCode练题——13. Roman to Integer
1.题目13. Roman to Integer Roman numerals are represented by seven different symbols: I, V, X, L, C, D ...
- 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 ,即 ...
- leecode刷题(13) -- 字符串中的第一个唯一字符
leecode刷题(13) -- 字符串中的第一个唯一字符 字符串中的第一个唯一字符 描述: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = & ...
- Leetcode 13. Roman to Integer(水)
13. Roman to Integer Easy Roman numerals are represented by seven different symbols: I, V, X, L, C, ...
- 《LeetBook》leetcode题解(13):Roman to Integer[E]
我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...
- C# 写 LeetCode easy #13 Roman to Integer
13.Roman to Integer Roman numerals are represented by seven different symbols: I, V, X, L, C, D and ...
- 13. Roman to Integer【leetcode】
Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within t ...
- 【LeetCode】13. Roman to Integer (2 solutions)
Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be within t ...
随机推荐
- PIE SDK算法的自定义扩展
1.算法功能简介 算法的自定义扩展允许用户自主开发新的算法.自定义的算法必须实现PIE.SystemAlgo.BaseSystemAlgo基础类,这样才能被PIE的算法管理器调用起来. 2.算法功能实 ...
- Navicat Premium Mac 12 破解(CV别人的,但是亲测能用)
第一步:这部分暂时存到文本编辑器中 公钥: -----BEGIN PUBLIC KEY-----MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQB8vXG0ImYh ...
- Ubuntu(Linux) 下 zip 命令使用详解
1.功能作用:压缩文件或者目录 2.位置:/usr/bin/zip 3.格式用法:zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfi ...
- Linux getopt()函数 getopt_long()函数---转
http://hi.baidu.com/scoundrelgg/item/d4083f8412eea05d26ebd97f Linux getopt()函数 getopt_long()函数 get_o ...
- 转帖:kindeditor编辑区空格被隐藏,导致所见所得不一致的解决办法
1.修改kindereditor-all.js中的 var re = /(\s)<(/)?([\w-:]+)((?:\s+|(?:\s+[\w-:]+)|(?:\s+[\w-:]+=[^\s&q ...
- bzoj 5308: [Zjoi2018]胖
Description Cedyks是九条可怜的好朋友(可能这场比赛公开以后就不是了),也是这题的主人公. Cedyks是一个富有的男孩子.他住在著名的ThePLace(宫殿)中. Cedyks是一个 ...
- Spring Chapter4 WebSocket 胡乱翻译 (一)
4. WebSocket 包含了Servlet stack,原生WebSocket交互,通过SockJS模拟,并且通过STOMP在WebSocket之上订阅.发布消息. 4.1 简介 不扯了,看到这个 ...
- javascript实现数据结构:稀疏矩阵的十字链表存储表示
当矩阵的非零个数和位置在操作过程中变化大时,就不宜采用顺序存储结构来表示三元组的线性表.例如,在作“将矩阵B加到矩阵A上”的操作时,由于非零元的插入或删除将会引起A.data中元素的移动.为此,对这种 ...
- 关于 “VMware Workstation 不可恢复错误- (vcpu-0)”
重装系统后第一次在 VMware Workstation 上创建虚拟机,结果出现了 VMware Workstation 不可恢复错误: (vcpu-0) 错误. 于是我们遵循它给出的提示,查看一下日 ...
- 机器学习(一)——K-近邻(KNN)算法
最近在看<机器学习实战>这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习. 一 . K-近邻算法(KNN)概述 最简单最初级的 ...