top13
和上一道题相反,将罗马数字转换成阿拉伯数字。
解法一
先来一种不优雅的,也就是我开始的想法。就是遍历字符串,然后转换就可以,但同时得考虑 IV,IX 那些特殊情况。
publicintgetInt(charr) { intans=0; switch (r) { case'I': ans=1; break; case'V': ans=5; break; case'X': ans=10; break; case'L': ans=50; break; case'C': ans=100; break; case'D': ans=500; break; case'M': ans=1000; } returnans; } publicintgetInt(charr, charr_after) { intans=0; switch (r) { case'I': ans=1; break; case'V': ans=5; break; case'X': ans=10; break; case'L': ans=50; break; case'C': ans=100; break; case'D': ans=500; break; case'M': ans=1000; break; } if (r=='I') { switch (r_after) { case'V': ans=4; break; case'X': ans=9; } } if (r=='X') { switch (r_after) { case'L': ans=40; break; case'C': ans=90; } } if (r=='C') { switch (r_after) { case'D': ans=400; break; case'M': ans=900; } } returnans; } publicbooleanisGetTwoInt(charr, charr_after) { if (r=='I') { switch (r_after) { case'V': returntrue; case'X': returntrue; } } if (r=='X') { switch (r_after) { case'L': returntrue; case'C': returntrue; } } if (r=='C') { switch (r_after) { case'D': returntrue; case'M': returntrue; } } returnfalse; } publicintromanToInt(Strings) { intans=0; for (inti=0; i<s.length() -1; i++) { ans+=getInt(s.charAt(i), s.charAt(i+1)); //判断是否是两个字符的特殊情况if (isGetTwoInt(s.charAt(i), s.charAt(i+1))) { i++; } } //将最后一个字符单独判断,如果放到上边的循环会越界if (!(s.length() >=2&&isGetTwoInt(s.charAt(s.length() -2), s.charAt(s.length() -1)))) { ans+=getInt(s.charAt(s.length() -1)); } returnans; }
解法二
https://leetcode.com/problems/roman-to-integer/description/
publicintromanToInt(Strings) { intsum=0; if(s.indexOf("IV")!=-1){sum-=2;} if(s.indexOf("IX")!=-1){sum-=2;} if(s.indexOf("XL")!=-1){sum-=20;} if(s.indexOf("XC")!=-1){sum-=20;} if(s.indexOf("CD")!=-1){sum-=200;} if(s.indexOf("CM")!=-1){sum-=200;} charc[]=s.toCharArray(); intcount=0; for(;count<=s.length()-1;count++){ if(c[count]=='M') sum+=1000; if(c[count]=='D') sum+=500; if(c[count]=='C') sum+=100; if(c[count]=='L') sum+=50; if(c[count]=='X') sum+=10; if(c[count]=='V') sum+=5; if(c[count]=='I') sum+=1; } returnsum; }
把出现的特殊情况,提前减了就可以。
时间复杂度:O(1)。
空间复杂度:O(1)。
总
这道题也不难,自己一开始没有充分利用罗马数字的特点,而是用一些 if,switch 语句判断是否是特殊情况,看起来就很繁琐了。