我参加了一次面试,表现非常糟糕。所以,现在我正试图找到问题的解决方案。这是面试问题:
“我们有以下映射:
M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1.
我们有以下规则:
每个字母对应一个正整数值
将这些值加在一起,除了...
...当一个值(或相同值的运行)后跟一个更大的值时,您减去该运行值的总和。
例子:
IIX -> 8
MCCMIIX -> 1808
我们得到了这个 Java 方法:int valueOfRoman(char roman)
。
我们已经实现了 Java 方法:int romanToInt(String s)
"
我知道这不是一个正确的罗马数字系统,但这是实际问题。
我能够为一个合适的罗马系统编写一个可行的解决方案。但我无法更改它以使其适应这些新规则,尤其是规则 3。我已经尝试过,但没有成功。我现在的解决方案是,对于 IIX,它打印 10,而不是正确答案 8。这是我的代码(我还为测试实现了 valueOf
):
static int romanToInt(String s) {
char curr;
int currVal;
char prev;
int prevVal;
int total = valueOfRoman(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
curr = s.charAt(i);
currVal = valueOfRoman(curr);
prev = s.charAt(i-1);
prevVal = valueOfRoman(prev);
total += currVal;
if(currVal > prevVal) {
total = total - (2*prevVal);
}
}
return total;
}
static int valueOfRoman(char c) {
if (c == 'M') {
return 1000;
} else if (c == 'D') {
return 500;
} else if (c == 'C') {
return 100;
} else if (c == 'L') {
return 50;
} else if (c == 'X') {
return 10;
} else if (c == 'V') {
return 5;
} else if (c == 'I') {
return 1;
}
return -1;
}
非常感谢任何帮助。如果您能告诉我如何修改我的代码,那将特别有用。谢谢!
编辑:我编辑了方法的名称,使它们更清晰。
最佳答案
我的看法 - 使用您提供的公认的小测试。
static int rom2int(String s) {
if (s == null || s.length() == 0) {
return 0;
}
// Total value.
int total = 0;
// The most recent.
char current = s.charAt(0);
// Total for the current run.
int run = valueOf(current);
for (int i = 1; i < s.length(); i++) {
char next = s.charAt(i);
int value = valueOf(next);
if (next == current) {
// We're in a run - just keep track of its value.
run += value;
} else {
// Up or down?
if (value < valueOf(current)) {
// Gone down! Add.
total += run;
} else {
// Gone UP! Subtract.
total -= run;
}
// Run ended.
run = valueOf(next);
}
// Kee track of most recent.
current = next;
}
return total + run;
}
private void test(String s) {
System.out.println("Value of " + s + " = " + rom2int(s));
}
public void test() {
test("IVX");
test("IIVVL");
test("IIX");
test("MCCMIIX");
test("MVVV");
}
打印
Value of IVX = 4 - Odd!!!
Value of IIVVL = 38
Value of IIX = 8
Value of MCCMIIX = 1808
Value of MVVV = 1015
关于java - 罗马整数 - 但使用 "different"罗马数字系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29037240/