基于Java的一些解题总结。
一、题目描述
示例:
二、解题思路
先定义一个函数value返回每个单独的罗马数字对应的数值。由于存在六种特殊规则,再定义一个函数specialValue,返回触发特殊规则是对应的数值。
三、自写代码
class Solution {
public int romanToInt(String s) {
int result = 0;
int i;
for(i = 0; i < s.length()-1; i++){
char a = s.charAt(i);
char b = s.charAt(i+1);
if(value(a) >= value(b))
result += value(a);
else{
result += specialValue(a,b);
i++;
}
}
return i == s.length()-1?(result + value(s.charAt(i))):result;
}
private int value(char ch) {
switch(ch){
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
}
throw new RuntimeException("不是罗马数字");
}
private int specialValue(char a,char b){
String s = Character.toString(a) + Character.toString(b);
if (s.equals("IV"))
return 4;
else if (s.equals("IX"))
return 9;
else if (s.equals("XL"))
return 40;
else if (s.equals("XC"))
return 90;
else if (s.equals("CD"))
return 400;
else if (s.equals("CM"))
return 900;
else
throw new RuntimeException("不是罗马数字");
}
}
这里注意for循环的边界条件,因为需要判断
if(value(a) >= value(b))
来得到是否触发特殊规则,所以如果写成 i < s.length() ,运算最后一个b的时候就会造成下标溢出。
for循环结束时分两种情况:
第一种,最后一个字符和倒数第二个字符不触发特殊规则,这种情况下结束循环,会导致最后一个字符的数值没有被计入,需要在返回值中加上。此时 i = s.length() -1
第二种,最后一个字符和倒数第二个字符触发特殊规则,此时最后第一字符的值已经和倒数第二个字符的值捆绑计入。此时,i = s.length()
所以在返回时进行判断。
return i == s.length()-1?(result + value(s.charAt(i))):result;
四、别人的解法
一言蔽之,把一个小值放在大值的左边,就是做减法,否则为加法。
import java.util.*;
class Solution {
public int romanToInt(String s) {
int sum = 0;
int preNum = getValue(s.charAt(0));
for(int i = 1;i < s.length(); i ++) {
int num = getValue(s.charAt(i));
if(preNum < num) {
sum -= preNum;
} else {
sum += preNum;
}
preNum = num;
}
sum += preNum;
return sum;
}
private int getValue(char ch) {
switch(ch) {
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
default: return 0;
}
}
}
作者:donespeak
链接:https://leetcode-cn.com/problems/roman-to-integer/solution/yong-shi-9993nei-cun-9873jian-dan-jie-fa-by-donesp/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这样的解法会比我写的解法快很多。我的解法是把特殊规则都单独列举出来,而这个解法通过现象看本质,总结出来罗马数字的运算规则。