leetcode 原文:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
本人属于小白,写这个有点费劲,写笔记把自己的思路和遇到的困难写出了,欢迎指出不足。
写这个时候遇到的问题如下:
1、罗马数字到阿拉伯数字的逻辑。下图来自百度,图片侵权删。
也就是说,对于I、V、X、L、C、D、M,每个代表的权值:1、5、10、50、100、500、1k。权值大的字母出现在小的之前可以直接相加,而权值小的在权值大的之前,那么这个权值小的字母所代表的权值需要被减去。这里的时候基友提醒了我,能被减去的都是像1、10、100这样的,而且是相邻的才减,一般不会减去带5的。
2、我考虑过用char 还是用string去表示这个输入的字符串,leetcode直接给的string。这里有个米有解决的问题,就是如果用char 的话,肯定是define一个用不到的最大值了,那怎么记录已经用过的有多少个?
3、比上一个小怎么表示?我曾经想过用1、2、3、4、5这样的优先级,然后优先级低的和下一个优先级比较,然后直接减去1、10、100等。写的时候想了想,太麻烦了。还要再记录等级么?费劲。。后来基友提醒说每次都是相邻的才能被减去就是,像IV可以存在,像IL就不会存在的。所以这个思路和下面的差不多,只要先把特殊情况枚举,然后正常相加就可以。第二段代码后来又验证了这个思路。
所以我用了个255长度的数组(其实应该用128,但是当时不知道为啥脑抽用了255,可能这就是对二进制的愤怒吧。),然后对应字母直接写权值,每次找权值大小。 比较权值,决定是否减去上一次的。
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
本人属于小白,写这个有点费劲,写笔记把自己的思路和遇到的困难写出了,欢迎指出不足。
写这个时候遇到的问题如下:
1、罗马数字到阿拉伯数字的逻辑。下图来自百度,图片侵权删。
![](https://ss0.bdstatic.com/94oJfD_bAAcT8t7mm9GUKT-xh_/timg?image&quality=100&size=b4000_4000&sec=1502719704&di=1ce355b8b069f485031511d619b358cb&src=http://image94.360doc.com/DownloadImg/2016/01/2910/65216490_1.jpg)
也就是说,对于I、V、X、L、C、D、M,每个代表的权值:1、5、10、50、100、500、1k。权值大的字母出现在小的之前可以直接相加,而权值小的在权值大的之前,那么这个权值小的字母所代表的权值需要被减去。这里的时候基友提醒了我,能被减去的都是像1、10、100这样的,而且是相邻的才减,一般不会减去带5的。
2、我考虑过用char 还是用string去表示这个输入的字符串,leetcode直接给的string。这里有个米有解决的问题,就是如果用char 的话,肯定是define一个用不到的最大值了,那怎么记录已经用过的有多少个?
3、比上一个小怎么表示?我曾经想过用1、2、3、4、5这样的优先级,然后优先级低的和下一个优先级比较,然后直接减去1、10、100等。写的时候想了想,太麻烦了。还要再记录等级么?费劲。。后来基友提醒说每次都是相邻的才能被减去就是,像IV可以存在,像IL就不会存在的。所以这个思路和下面的差不多,只要先把特殊情况枚举,然后正常相加就可以。第二段代码后来又验证了这个思路。
所以我用了个255长度的数组(其实应该用128,但是当时不知道为啥脑抽用了255,可能这就是对二进制的愤怒吧。),然后对应字母直接写权值,每次找权值大小。 比较权值,决定是否减去上一次的。
leetcode代码:
class Solution {
public:
int romanToInt(string s) {
int num[255],result=0;
char temp;
memset(num,0,255*sizeof(int));
num['I']=1;
num['V']=5;
num['X']=10;
num['L']=50;
num['C']=100;
num['D']=500;
num['M']=1000;
for(int i=0;i<s.length();i++)
{
if(i) {
if(num[temp]<num[s[i]]) result-=2*num[temp];
}
result+=num[s[i]];
temp=s[i];
}
return result;
}
};
写的时候还是很傻的,比如那个num[‘i’]我一开始写的num[i],报错说没有定义这个标识符。比如我把那个if(i)那里条件不小心写成了if(!i),很傻的。还好测试了一下。。
接下来是验证之前的思路,只把重要代码附上
if(s.find("IV",0)!=s.npos) result-=2;
if(s.find("IX",0)!=s.npos) result-=2;
if(s.find("XL",0)!=s.npos) result-=20;
if(s.find("XC",0)!=s.npos) result-=20;
if(s.find("CD",0)!=s.npos) result-=200;
if(s.find("CM",0)!=s.npos) result-=200;
for(int i=0;i<s.length();i++)
{
if(s[i]=='M')
result+=1000;
else if(s[i]=='D')
result+=500;
else if(s[i]=='C')
result+=100;
else if(s[i]=='L')
result+=50;
else if(s[i]=='X')
result+=10;
else if(s[i]=='V')
result+=5;
else result+=1;
}