版权声明:本文为博主原创文章,未经博主允许不得转载。
一、问题描述
Roman numerals are represented by seven different symbols: I
, V
, X
, L
, C
, D
and M
.
Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 to 3999.
意思是给你一个罗马数字,求出它所对应的整数。
二、生词
convert vi. /kən'vɜːt/ 转变
guaranteed adj /'gærən'tid/ 有保证的
三、样例及说明
四、解题思路及代码
认真观察罗马数字转化为整数的过程,可以得出一个规律,如果前一个罗马数字所代表的整数比后一个罗马数字所代表的整数大或者相等,那么运算的就是加法,否则是减法运算。
1 class Solution { 2 public int romanToInt(String s) { 3 int sum = 0; 4 for(int i=0; i < s.length()-1; i++) { //遍历 0-s.length()-1 的罗马数字 5 if(wNum(s.charAt(i))>=wNum(s.charAt(i+1))) { //比后面的大或者相等用加法运算 6 sum += wNum(s.charAt(i)); 7 } else { //否则用减法运算 8 sum -= wNum(s.charAt(i)); 9 } 10 } 11 return sum+wNum(s.charAt(s.length()-1));//最后一个罗马数字一定是用加法运算 12 } 13 public int wNum(char c) { 14 switch(c) { 15 case 'I' : 16 return 1; 17 18 case 'V': 19 return 5; 20 21 case 'X': 22 return 10; 23 24 case 'L': 25 return 50; 26 27 case 'C': 28 return 100; 29 30 case 'D': 31 return 500; 32 33 case 'M': 34 return 1000; 35 36 } 37 throw new RuntimeException("invalid char"); 38 } 39 }
我看了一下这道题目前为止运行时间最快的题解,跟我的思路一样的,但是从代码上看,比我简洁多了,学习了。
1 class Solution { 2 3 public static int romanToInt(String s) { 4 int num = 0; 5 int n = s.length(); 6 7 for (int i = 0; i < n-1; i++) { 8 int curr = map(s.charAt(i)); 9 int next = map(s.charAt(i+1)); 10 num = curr < next ? num - curr : num + curr; 11 } 12 13 num += map(s.charAt(n-1)); 14 15 return num; 16 } 17 18 private static int map(char c) { 19 switch(c) { 20 case 'I': return 1; 21 case 'V': return 5; 22 case 'X': return 10; 23 case 'L': return 50; 24 case 'C': return 100; 25 case 'D': return 500; 26 case 'M': return 1000; 27 default: return 0; 28 } 29 } 30 31 }
五、反思总结
首先,三目运算符一般都可以替换 if...else语句,可以让代码更简洁美观,性能会比 if...else好一点。参考:https://blog.youkuaiyun.com/prestonzzh/article/details/52538541
其次,代码冗余太严重了。。。得改噢!