题目描述
罗马数字转整数
点击上方链接即可到达题目
解题思路
首先我们需要一个能将字母转换成数字的方法,接着我分析了罗马数字拼接的规律,发现如果重个位数出发(个位数一定为正值),当左边的数如果大于或等于右边的数,那么左边数就为正值,例如:VI,左V比右I大,所以V为正值,VI就等于每个值相加的和,即V+I=5+1=6,当左边的数如果小于右边的数,那么右边的数就为负值,例如:IV,左I比右V小,所以这里的I为负值-1,所以IV=(-1)+5=4,
这样看来只需要判断每个位置的正负值情况,再将每个值相加就等于这个罗马数字对应的整数了,基于这种思路下,我的代码如下:
/**
* @param {string} s
* @return {number}
*/
var romanToInt = function (s) {
if (!s) return 0
let sAry = s.split('').map(item => item = getNum(item));
let temp = sAry.pop();
let sum = temp;
while (sAry.length > 0) {
let s1 = sAry.pop();
if (s1 < temp) {
sum -= s1
} else {
sum += s1
}
temp = s1;
}
return sum
};
function getNum(nStr) {
switch (nStr) {
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;
}
}
注:这里使用的数组方法,一次性将单个的罗马数字转换成整数,当然也可以利用字符串的charAt(index)方法,然后调用按需要调用getNum()。
解题思路(2)
在浏览解题区时发现另一种简单的方法,这种方法的出发点在于将六种特殊情况的字母组合用六个字母进行代替,代码我拷在下面:
class Solution {
public int romanToInt(String s) {
s = s.replace("IV","a");
s = s.replace("IX","b");
s = s.replace("XL","c");
s = s.replace("XC","d");
s = s.replace("CD","e");
s = s.replace("CM","f");
int result = 0;
for (int i=0; i<s.length(); i++) {
result += which(s.charAt(i));
}
return result;
}
public int which(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;
case 'a': return 4;
case 'b': return 9;
case 'c': return 40;
case 'd': return 90;
case 'e': return 400;
case 'f': return 900;
}
return 0;
}
}
写在最后:如有误,请指正