我正在尝试创建一些代码来读取罗马数字,并将它们转换为整数。我拥有的问题是9s和4s。如果9或4在一个数字内(即LIV是54,LXI是59),我就能读到它,但它本身(IV和IX)只读6和11。下面是我的代码:
public static void RomantoInt(String s) {
HashMap<Character, Integer> RomanNums = new HashMap<>();
int count = 0;
RomanNums.put('I', 1);
RomanNums.put('V', 5);
RomanNums.put('X', 10);
RomanNums.put('L', 50);
RomanNums.put('C', 100);
RomanNums.put('D', 500);
RomanNums.put('M', 1000);
LinkedList<Character> UserInput = new LinkedList<>();
//Adds Each numeral to the Array
for (int i = 0; i < s.length(); i++) {
char userint = s.charAt(i);
UserInput.add(userint);
}
//loop through the array backwards and adds up the count.
for(int j =UserInput.toArray().length -1; j> -1 ; j--) {
int grab = RomanNums.get(UserInput.get(j));
count += grab;
// Checks for 4s and 9s.
if(grab == RomanNums.get('X') && (j - 1) == RomanNums.get('I')) {
count -= 2;
}
}
System.out.println(count);发布于 2022-09-11 19:38:52
将j - 1 --字符串中的一个位置--与罗马数字的值进行比较似乎没有任何意义。
确切地说,只有当罗马字母“i”是第二个字符时,它才会起作用。
你真正想要测试的是(j-1)位置上的字符是否是'I‘。
正确的表述应该是
if (grab == RomanNums.get('X') &&
j > 0 &&
UserInput.get(j-1) == 'I') ...发布于 2022-09-11 22:49:21
这是我对leetcode的解决方案:https://leetcode.com/problems/roman-to-integer/
您对反向读取输入有正确的想法,一个循环应该足够完成工作。
你所需要做的就是在你需要减去罗马数字的情况下解释,你可以通过跟踪前一个罗马数字来进行比较。
例如,当输入字符串为:"IX“时
我们在第一次迭代中从'X‘开始,因为前面的迭代等于'?’我们只需添加10并将其设置为'X‘。现在,当我们试图在下一次迭代中总结'I‘时,我们会注意到它是'X’,而不是将1加到运行的和中,我们应该减去1,总数应该是9。
public int romanToInt(String s) {
int sum = 0;
char prev = '?';
for(int i = s.length()-1;i >= 0;i--) {
switch(s.charAt(i)) {
case 'I' : sum += prev == 'V' || prev == 'X' ? -1 : 1;
break;
case 'V' : sum += 5;
break;
case 'X' : sum += prev == 'L' || prev == 'C' ? -10 : 10;
break;
case 'L' : sum += 50;
break;
case 'C' : sum += prev == 'D' || prev == 'M' ? -100 : 100;
break;
case 'D' : sum += 500;
break;
case 'M' : sum += 1000;
break;
default :
break;
}
prev = s.charAt(i);
}
return sum;
}Time complexity is O(n) - Iterated the length of the input string
Space complexity is O(1) - No additional data structure was neededhttps://stackoverflow.com/questions/73682137
复制相似问题