我要跟踪的罗马数字到整数转换器:
https://www.selftaughtjs.com/algorithm-sundays-converting-roman-numerals/
我尝试将Javascript函数转换为Java:
public class RomanToDecimal {
public static void main (String[] args) {
int result = 0;
int[] decimal = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] roman = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
// Test string, the number 895
String test = "DCCCXCV";
for (int i = 0; i < decimal.length; i++ ) {
while (test.indexOf(roman[i]) == 0) {
result += decimal[i];
test = test.replace(roman[i], "");
}
}
System.out.println(result);
}
}
输出为 615
,这是错误的。
请帮助我了解我出了什么问题。
答案 0 :(得分:2)
您的test = test.replace(roman[i], "");
将所有出现的“ C”替换为“”,因此,找到第一个“ C”并加100后,就消除所有剩余的“ C”,并且从不计算。因此,您实际上计算出"DCXV"
的值,即615
。
您仅应替换起始索引为0的roman[i]
的出现,可以通过替换来实现:
test = test.replace(roman[i], "");
具有:
test = test.substring(roman[i].length()); // this will remove the first 1 or 2 characters
// of test, depending on the length of roman[i]
以下内容:
int result = 0;
int[] decimal = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] roman = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};
// Test string, the number 895
String test = "DCCCXCV";
for (int i = 0; i < decimal.length; i++ ) {
while (test.indexOf(roman[i]) == 0) {
result += decimal[i];
test = test.substring(roman[i].length());
}
}
System.out.println(result);
打印:
895
答案 1 :(得分:1)
test = test.replace(roman[i], "");
这将替换每次出现的情况。相反,您只应截断字符串开头(位置0)的出现。
尝试使用substring
而不是replace,并以roman[i]
的长度作为参数传递