2014-07-12 2 views
-1

최근 배열의 요소가 아나그램인지 확인하라는 질문을 받았습니다. 구현을 완료했지만 테스트를 실행하면 5 개의 테스트 케이스 중 1 개만 통과했습니다. 문제는 그들이 테스트가 무엇인지 알 수 없으므로 내가 실패한 것에 대해 정말로 확신 할 수 없다는 것입니다. 기본적으로 단어의 문자를 곱하고이 숫자를 배열에 추가하는 아래의 대답을 다시 작성했습니다. 그런 다음 한 배열의 숫자를 다른 배열의 숫자와 비교하여 동일하면 true를 인쇄합니다. 기본적으로이 시나리오가 실패 할 수있는 시나리오는 무엇이며 어떻게 이러한 코드를 수정하여 이러한 사례를 설명 할 수 있습니까? 내가 main 메소드에서 실행 내 위의 예에서두 단어가 아나그램인지 확인합니다.

public class anagramFinder { 
    public static void main (String[] args){ 
     String[] listOne = new String[5]; 
     listOne[0] = "hello"; 
     listOne[1] = "lemon"; 
     listOne[2] = "cheese"; 
     listOne[3] = "man"; 
     listOne[4] = "touch"; 

     String[] listTwo = new String[5]; 
     listTwo[0] = "olleh"; 
     listTwo[1] = "melon"; 
     listTwo[2] = "house"; 
     listTwo[3] = "namer"; 
     listTwo[4] = "tou"; 

     isAnagram(listOne,listTwo); 
    } 

    public static void isAnagram(String[] firstWords, String[] secondWords){ 
     int firstTotal = 1; 
     int secondTotal = 1; 
     int[] theFirstInts = new int[firstWords.length]; 
     int[] theSecondInts = new int[secondWords.length]; 

     for(int i = 0;i<firstWords.length;i++){ 
      for(int j = 0;j<firstWords[i].length();j++){ 
       firstTotal = firstTotal * firstWords[i].charAt(j); 
      } 

      theFirstInts[i] = firstTotal; 
      firstTotal = 1; 
     } 

     for(int i = 0;i<secondWords.length;i++){ 
      for(int j = 0;j<secondWords[i].length();j++){ 
       secondTotal = secondTotal * secondWords[i].charAt(j); 
      } 

      theSecondInts[i] = secondTotal; 
      secondTotal = 1; 
     } 

     for(int i=0;i<minimum(theFirstInts.length,theSecondInts.length);i++){ 
      if(theFirstInts[i] == theSecondInts[i]){ 
       System.out.println("True"); 
      } else { 
       System.out.println("False"); 
      } 
     } 
    } 
    public static int minimum(int number,int otherNumber){ 
     if(number<otherNumber){ 
      return number; 
     } else { 
      return otherNumber; 
     } 
    } 
} 

,이 인쇄 참 참 거짓 ASCII 코드를 곱하여의 아이디어는 나쁘지 않다, 그러나 완벽하지

+0

나는 그 코드가 무엇을하고 있는지 알지 못합니다. –

+2

퀴즈에서이 코드에 대해 교수님이나 TA에게 이야기해야합니다. 그들은 왜 당신이 문제가 있는지 알고 있어야합니다. 또한, 내가 대학에있을 때, 우리는 "손 실행"을 가르쳤다. 이 코드를 손으로 직접 다른 입력으로 실행하고 오류가있는 위치를 찾으십시오. – markspace

+0

'int'가 오버플로하기 때문에 약 5 자 이상의 단어는 실패하는 경향이 있습니다. 또한 편지의 두 가지 콤보가 동일한 제품을 생산할 수 없다는 것은 확실하지 않습니다. –

답변

1

올바른 거짓 거짓. 두 가지 다른 단어가 'a'에서 'z'의 주어진 범위와 적당한 길이 내에서 동일한 제품을 가질 수 있음을 보여주기 위해서는 심층 분석이 필요합니다.

기존의 접근 방식 중 하나는 문자를 계산하고지도를 비교하기위한지도를 만드는 것입니다.

다른 하나는 문자를 정렬하고 정렬 된 문자열을 비교합니다.

세 번째 단어는 첫 번째 단어의 문자를 반복하고 두 번째 단어의 문자를 찾은 다음 두 번째 단어를 그 문자로 줄입니다.

내가 네 번째 방법을 생각할 수 없다,하지만 난 하나 ;-)

이 거의 확실 해요 나중에

음, 여기 네 번째 방법 : '26 개 소수를 할당 a '~'z '및 (BigInteger를 사용하여) 단어의 문자에 따라 소수를 곱합니다. Anagrams는 동일한 제품을 생산합니다.

+0

오케이, 나는 이것이 더 나은 이유를 알게된다. 네 번째 방법은 기본적으로 내가하려고했던 것이었지만 숫자가 소수가 아닌 경우 동일한 제품과 동일한 다른 문자 조합을 사용하게 만들 수있었습니다. 명확한 설명 주셔서 감사합니다. – RDSpinz

+0

글쎄, 그리고 "무제한"숫자로 제품을 계산할 필요성. – laune

2

비슷한 질문에서 내 대답 복사.

다음은 정렬 또는 다중 루프 또는 해시 맵을 사용하지 않고 간단한 O (n) 솔루션입니다. 첫 번째 배열의 각 문자 수를 증가시키고 두 번째 배열의 각 문자 수를 줄입니다. 결과 counts 배열이 0으로 가득 찬 경우 문자열은 아나그램입니다. counts 배열의 크기를 늘려 다른 문자를 포함하도록 확장 할 수 있습니다.

class AnagramsFaster{ 

    private static boolean compare(String a, String b){ 
     char[] aArr = a.toLowerCase().toCharArray(), bArr = b.toLowerCase().toCharArray(); 
     if (aArr.length != bArr.length) 
      return false; 
     int[] counts = new int[26]; // An array to hold the number of occurrences of each character 
     for (int i = 0; i < aArr.length; i++){ 
      counts[aArr[i]-97]++; // Increment the count of the character at i 
      counts[bArr[i]-97]--; // Decrement the count of the character at i 
     } 
     // If the strings are anagrams, the counts array will be full of zeros 
     for (int i = 0; i<26; i++) 
      if (counts[i] != 0) 
       return false; 
     return true; 
    } 

    public static void main(String[] args){ 
     System.out.println(compare(args[0], args[1])); 
    } 
} 
관련 문제