这是一个面试问题。我认为下面的代码有点工作并且有一些错误。问题如下 -
在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)即使上面使用的测试用例应该给出。 有什么建议来解决这个问题如果有任何更好的方法/想法是最受欢迎的。
答案 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,它应该可以正常工作。