罗马到整数 - 但使用"不同的"罗马数字系统

use*_*893 8 java string algorithm roman-numerals

我接受了一次采访,我的表现非常糟糕.所以,现在我正试图找到问题的解决方案.这是面试问题:

"我们有以下映射:
M:1000,D:500,C:100,L:50,X:10,V:5,I:1.

我们有以下规则:

  1. 每个字母映射到正整数值

  2. 您将值一​​起添加,但...

  3. ...当一个值(或相同值的运行)后跟一个更大的值时,您减去该运行值的总和.

例子:

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;
}
Run Code Online (Sandbox Code Playgroud)

任何帮助都非常感谢.特别有用的是,如果你能告诉我如何修改我的代码.谢谢!

编辑:我编辑了方法的名称,以便更清楚.

Old*_*eon 2

我的看法 - 适用于您提供的公认的小测试。

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");
}
Run Code Online (Sandbox Code Playgroud)

印刷

Value of IVX = 4 - Odd!!!
Value of IIVVL = 38
Value of IIX = 8
Value of MCCMIIX = 1808
Value of MVVV = 1015
Run Code Online (Sandbox Code Playgroud)

  • @user224567893 - “IIVVL”怎么样。我得到 38 - 意思是 -2 + -10 + 50 = 38。 (2认同)