Question:
Given a roman numeral, convert it to an integer.
Input is guaranteed to be within the range from 1 to 3999.
给一个罗马数字,把它转化成阿拉伯数字,可以保证罗马数字的输入在1到3999之间。
这个题和我上篇文章写的《leetcode:Integer to Roman(整数转化为罗马数字》正好相反,在上一篇文章中,我简单介绍了罗马数字的计数方法和组数规则,并举了一些例子,大家可以参考,在这里我再介绍。这个题我写的代码不简洁,甚至有些繁琐,但是思路简单明了,肯定还有更多比这更好的方法,但是它作为一种思路,也通过了leetcode的测试,愿意和大家分享一下,一起学习,共同进步。
算法基本思想:① 罗马构造数字有一定规律,虽然表示个位、十位、百位、千位的字母不同,但是这种规律相同,可以把这种构词规律写成一个函数 public int romanToOneNo(String s,int i),s表示构成罗马数字个位或者十位或者百位或者千位的罗马字母,i=1表示个位,i=2表示十位,i=3表示百位,i=4表示千位,经过这样的转换,可以转换成相应位上的数字。
② 在public int romanToInt(String s)中,s就是要转换的罗马字符串,下面的问题就转变为怎样分割字符串s,使个位、十位、百位、千位的字母分离出来。依次调用romanToOneNo(String s,int i)函数,就可以得到各位上的值。
③ 设计一个sum变量,对各位上的数乘以相应的1000、100、10、1,返回sum就可以了。
代码实现(java):
1 class Solution13 { 2 public int romanToInt(String s) { 3 // Note: The Solution object is instantiated only once and is reused by each test case. 4 int sum=0; 5 String Temp=""; 6 int i=0; 7 while(i<s.length()&&s.charAt(i)=='M'){ 8 Temp+=s.charAt(i); //这个循环的目的就是把表示千位上的罗马字母依次累加到Temp 9 i++; 10 } 11 sum+=1000*romanToOneNo(Temp, 4); 12 Temp=""; 13 while(i<s.length()&&(s.charAt(i)=='C'||s.charAt(i)=='D'||s.charAt(i)=='M')){ 14 Temp+=s.charAt(i); //这个循环的目的就是把表示百位上的罗马字母依次累加到Temp 15 i++; 16 } 17 sum+=100*romanToOneNo(Temp, 3); 18 Temp=""; 19 while(i<s.length()&&(s.charAt(i)=='X'||s.charAt(i)=='L'||s.charAt(i)=='C')){ 20 Temp+=s.charAt(i); //这个循环的目的就是把表示十位上的罗马字母依次累加到Temp 21 i++; 22 } 23 sum+=10*romanToOneNo(Temp, 2); 24 Temp=""; 25 //System.out.println("The program is running"); 26 while(i<s.length()&&(s.charAt(i)=='I'||s.charAt(i)=='V'||s.charAt(i)=='X')){ 27 Temp+=s.charAt(i); //这个循环的目的就是把表示个位上的罗马字母依次累加到Temp 28 i++; 29 } 30 sum+=romanToOneNo(Temp, 1); 31 return sum; 32 } 33 public int romanToOneNo(String s,int i){//这个函数的作用就是转化应该是i位上的字符串为单个的数, 34 //s字符串表示的数转换后应该在i位上 35 String str1,str2,str3;//拿0~9之间的数举例,str1表示I,str2表示V,str3表示X 36 if(1==i){ //下面if语句是判断n是哪一位上的,依次用罗马数字表示1、5、10 37 str1="I"; //个位上的数 38 str2="V"; 39 str3="X"; 40 } 41 else if(2==i){ 42 str1="X"; //十位上的数 43 str2="L"; 44 str3="C"; 45 }else if(3==i){ 46 str1="C"; //百位上的数 47 str2="D"; 48 str3="M"; 49 }else{ 50 str1="M"; //千位上的数,因为最大数到3999,所以str2和str3为空 51 str2=""; 52 str3=""; 53 } 54 if(s.equals("")) //下面以个位数字0~9为例说明,如果字符串为空,返回0 55 return 0; 56 if(s.equals(str1)) //如果s为“I” 57 return 1; 58 if(s.equals(str1+str1)) //如果s为“II” 59 return 2; 60 if(s.equals(str1+str1+str1))//如果s为“III” 61 return 3; 62 if(s.equals(str1+str2)) //如果s为“IV” 63 return 4; 64 if(s.equals(str2))//如果s为“V” 65 return 5; 66 if(s.equals(str2+str1))//如果s为“VI” 67 return 6; 68 if(s.equals(str2+str1+str1))//如果s为“VII” 69 return 7; 70 if(s.equals(str2+str1+str1+str1))//如果s为“VIII” 71 return 8; 72 if(s.equals(str1+str3)) //如果s为“IX” 73 return 9; 74 return -1; //如果以上条件都不符合,只能说明s不符合罗马数字的构词规则 75 } 76 }