查找输入的密码是否有效?

时间:2014-04-20 21:18:10

标签: java

这是一个面试问题。我认为下面的代码有点工作并且有一些错误。问题如下 -

在1-9键盘中,一个键无效。如果有人输入密码,则不会输入工作密钥。您已给出预期的密码和输入的密码。检查输入的密码是否有效 例如:输入164,预计为18684(当你输入18684时需要注意,164只将两者作为164输入)

上面的代码如下。

public static void main(String[] args){
        System.out.println(IsAMatch("164","18684"));  
    } 
    static boolean IsAMatch(String actual, String expected)
    {
        char faultyKey = '\0';
        int i = 0, j = 0;
        for(; i < expected.length() && j < actual.length(); ++i)
        {
            if(actual.charAt(j) != expected.charAt(i))
            {
                if('\0' != faultyKey){
                    if(faultyKey != expected.charAt(i))
                        return false;
                }
                else{
                    faultyKey = expected.charAt(i);
                }
            }
            else{
                ++j;
            }
        }
        System.out.println("FaultyKey= "+faultyKey);
        return (i == expected.length() - 1 && j == actual.length() - 1)? true : false;
    }

它正确检测到错误的密钥(Ex在这里是8),但输出错误(As False)即使上面使用的测试用例应该给出。 有什么建议来解决这个问题如果有任何更好的方法/想法是最受欢迎的。

4 个答案:

答案 0 :(得分:1)

将return语句更改为:

return (i == expected.length() && j == actual.length())? true : false;

错误是i和j都先增加然后检查它们是否符合循环条件。显然,当控制流从循环中爆发时,i和j都不能满足条件。因此,i和j分别与预期长度和实际长度完全相等。

此外,return语句中的表达式是无偿的。你可以在程序的那一点返回true,因为它是那个阶段的重言式。即您无法在代码中处于此时,表达式的计算结果为false。

答案 1 :(得分:0)

您的退货声明应为:

return (i == expected.length()  && j == actual.length()) ? true : false;

或更简单:

return (i == expected.length()  && j == actual.length());

因为当循环结束时i和j达到字符串的长度。

答案 2 :(得分:0)

static boolean IsAMatch(String actual, String expected) {
        char faultyKey = '\0';
        int i = 0, j = 0;
        for (; i < expected.length(); ++i) {
            if (j >= actual.length() || actual.charAt(j) != expected.charAt(i)) {
                if ('\0' != faultyKey) {
                    if (faultyKey != expected.charAt(i)) {
                        return false;
                    }
                } else {
                    faultyKey = expected.charAt(i);
                }
            } else {
                ++j;
            }
        }
        System.out.println("FaultyKey= " + faultyKey);
        return (i == expected.length() && j == actual.length()) ? true : false;
    }

考虑以下条件

System.out.println(IsAMatch("164", "186848"));

你的逻辑不起作用,因为在我遇到长度之前,j会满足实际长度。 你不需要在for循环中有条件j < actual.length

答案 3 :(得分:0)

问题在于这两个陈述:

i == expected.length() - 1
j == actual.length() - 1

每个人都删除-1,它应该可以正常工作。