leetcode13 :roman to integer

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,可能这就是对二进制的愤怒吧。),然后对应字母直接写权值,每次找权值大小。 比较权值,决定是否减去上一次的。


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;
	}




         写第二段代码的时候。。那个我一开始写的是if(s.find("VI")) 酱紫的话,一直会被判断为1。为什么呢?因为如果没有VI字符串,那么返回值为npos的最后位置。也就是字符串的最后位置。这个错误挺冤枉



        代码还有不完善的地方,非法的无法识别啊,比如像IL(49,然而49应该是XLIX)这样的。欢迎批评指正~
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值