我接受了一次面试,表现非常出色。所以,现在我正试图找到问题的解决方案。这是面试问题:

“我们有以下映射:
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
    

    07-24 15:03