13. 罗马数字转整数
逻辑分析能力
分析能力有待提高
class Solution {public int romanToInt(String s) {int result = 0;int special = 0;// 当前下标int i = 0;// 下标的下一位置int j = 0;// 当前的下标还在字符串里面while (i < s.length()) {// 求出下标的下一位置j = i + 1;// 如果下标的下一个位置 到达 字符串的末尾了if (j == s.length()){// 当前的值 + 当前字符对应的值result += charToNum(s.charAt(i));// 跳出循环break;}// 判断当前下标的字符是否能够与下一个字符 组成特殊情况StringBuilder stringBuilder = new StringBuilder();special = specialCondition(stringBuilder.append(s.charAt(i)).append(s.charAt(j)).toString());// 如果能够组成特殊情况if (special != 0){// 当前的值 + 特殊情况的值result += special;// 下标跳一位i = i + 2;}// 不能够组成特殊情况else {// 当前的值 + 当前字符对应的值result += charToNum(s.charAt(i));// 下标移到下一位i ++;}}return result;}/*** 特殊的规则适用的六种情况** @param s 字符串* @return int 结果*/private int specialCondition(String s) {switch (s) {case "IV": return 4;case "IX": return 9;case "XL": return 40;case "XC": return 90;case "CD": return 400;case "CM": return 900;default: return 0;}}/*** 字符转数字** @param i 字符* @return int 数字*/private int charToNum(char i) {switch (i) {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;}}
}
测试用例
public static void main(String[] args) {Solution solution = new Solution();System.out.println(solution.romanToInt("MCMXCIV"));}
作者:donespeak
链接:https://leetcode.cn/problems/roman-to-integer/solution/yong-shi-9993nei-cun-9873jian-dan-jie-fa-by-donesp/
按照题目的描述,可以总结如下规则:
一言蔽之,把一个小值放在大值的左边,就是做减法,否则为加法。
在代码实现上,可以往后看多一位,对比当前位与后一位的大小关系,从而确定当前位是加还是减法。当没有下一位时,做加法即可。
也可保留当前位的值,当遍历到下一位的时,对比保留值与遍历位的大小关系,再确定保留值为加还是减。最后一位做加法即可。
在这个解题思路链接的评论区中看到的。
妙蛙种子给妙趣角开门,妙到家了
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 res = 0;for (int i = 0; i < s.length(); i++) {res += getValue(s.charAt(i));}return res;}public int getValue(char c) {switch(c) {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;}
}