首页 > 代码库 > 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.
这个比之前的Integer To Roman还要简单一些,罗马数字转换到整数的话,举个一般的例子,LXVI==50+10+5+1==66,再举个例子,LXIV==50+10+(5-1)==64。基本上我们只要对第二个例子的情况做一些处理就好了。
int romanToInt(char* s) { int i=0,j=0,num=0; char roman[7]={‘M‘,‘D‘,‘C‘,‘L‘,‘X‘,‘V‘,‘I‘}; int value[7]={1000,500,100,50,10,5,1}; while(s[i]!=‘\0‘){ while(s[i]!=roman[j]) j++; if((j-1>=0&&s[i+1]==roman[j-1])||(j-2>=0&&s[i+1]==roman[j-2])){ if(s[i+1]==roman[j-1]) num+=value[j-1]-value[j]; else num+=value[j-2]-value[j]; i++; } else num+=value[j]; i++; } return num; }
我注意到这个算法下IIV(应该不是合法的罗马数字)的值将是1+(5-1)==5。而LeetCode给出的expected answer是3,也就是5-(2*1),所以我又写了另一个版本。
int romanToInt(char* s) { int i=0,j=0,num=0,rp=1; char roman[7]={‘M‘,‘D‘,‘C‘,‘L‘,‘X‘,‘V‘,‘I‘}; int value[7]={1000,500,100,50,10,5,1}; while(s[i]!=‘\0‘){ rp=1; while(s[i]!=roman[j]) j++; while(s[i]==s[i+1]){ rp++; i++; } if((j-1>=0&&s[i+1]==roman[j-1])||(j-2>=0&&s[i+1]==roman[j-2])){ if(s[i+1]==roman[j-1]) num+=value[j-1]-rp*value[j]; else num+=value[j-2]-rp*value[j]; i++; } else num+=rp*value[j]; i++; } return num; }
也就是多了一个rp(repeat)变量来处理连续出现的罗马字符数。
Roman to Integer问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。