2014-04-20 4 views
0

이것은 인터뷰 질문입니다. 나는 아래의 코드가 약간 동작하고 약간의 오류가 있다고 생각한다. 문제는 다음과 같습니다. -입력 한 암호가 유효한지 확인하십시오.

1-9 키패드에서 하나의 키가 작동하지 않습니다. 암호를 입력하면 작업 키가 입력되지 않습니다. 예상 암호와 암호를 입력했습니다. 입력 된 암호가 유효한지 확인하십시오 예 : 164, 예상 18684 (18684와 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; 
    } 

이 올바르게 잘못된 키를 감지한다 (예는 여기있다 8)하지만 (거짓으로) 잘못 출력을 제공하는 것은 위에서 사용 된 테스트 케이스는 사실 주어야한다하더라도. 해결 방법이 있습니까? 더 나은 방법/아이디어가 가장 높이 평가되는 경우. 간단한

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

나 :

+0

FYI - 답장에서 -1을 제거 할 것을 제안한 사람. IsAMatch ("164", "1868488")에 대한 대답이 잘못되었습니다. –

+0

코드에 문제가 한 번 더 발생했습니다. – WonderWorld

답변

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")); 

당신의 논리가 작동하지 않습니다 다음과 같은 조건을 고려하십시오. for 루프에 조건 j < actual.length이 필요하지 않습니다.

0

귀하의 return 문이 있어야한다

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

루프가 종료 될 때 i와 j는 문자열의 길이에 도달하기 때문이다.

1

변경 return 문에이 :

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

버그 i와 j 그들이 루프 조건을 충족하는 경우 모두 먼저 증가하고 확인 있다는 것입니다. 분명히 i와 j 모두 제어 흐름이 루프에서 빠져 나옴에 따라 조건을 충족시키지 못합니다. 따라서 i와 j는 예상 길이와 실제 길이가 각각 동일합니다.

또한 반환 명세서의 표현은 무의미합니다. 그 단계에서 동어 반복 (tautology)이기 때문에 프로그램의 그 시점에서 사실로 돌아갈 수 있습니다. 나는. 코드에서 그 시점에있을 수있는 방법이 없으며 표현식이 거짓으로 평가됩니다. 내가 만족하기 전에 길이 j는 실제 길이를 충족하기 때문

0

문제는이 두 문장에 있습니다 :

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

는 제거 - 그들 각각에 의해 일을하고 그것을 잘 작동합니다.

관련 문제