2017-02-17 5 views
-5

これは私がkattisで解決しようとしている課題です。 challenge。 私の考えは、jackが所有するすべてのCDを配列に格納してから、jillが所有するすべてのcdの配列をバイナリ検索することです。 検索でtrueが返された場合は、カウンタをインクリメントします。 そうでない場合、私は何もしません。 これは、このソリューションでは、第二のテストケースを失敗しなぜこのソリューションは使えませんか?

import java.util.*; 
import java.util.Scanner; 
public class Hello { 
    public static void main(String [] args) { 
     Scanner in = new Scanner(System.in); 
     int n = in.nextInt(); 
     int m = in.nextInt(); 
     int[] narr = new int[n]; 
     for (int i = 0; i<n; i++){ 
      narr[i] = in.nextInt(); 
     } 
     int count = 0; 
     for (int i=0; i< m; i++){ 
      int val = in.nextInt(); 
      int lo =0; 
      int hi = n-1; 
      while(lo<=hi){ 
       int md = lo + (hi - lo)/2; 
       if (val<narr[md]) hi =md-1; 
       else if(val>narr[md]) lo = md+1; 
       else{ 
        count++; 
        break; 
       } 
      } 
     } 
     System.out.println(count); 
     in.close(); 
    } 
} 

私の解決策です。私はインターネット上で同様のソリューションを見てきました。このようにlink 私に何が足りないのか教えてください。

ありがとうございました。

また、ジャックのCDを格納するためにhashSetを使用して、そのセットにJillsのいずれかが含まれている場合はカウンタをインクリメントしました。 このソリューションは、2番目のテストケースでも失敗します。

+8

ようこそスタックオーバーフロー!デバッガの使い方を学ぶ必要があるようです。 [補完的なデバッグ手法](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)にご協力ください。その後も問題が残っている場合は、もう少し詳しくお聞かせください。 –

+0

ありがとうございました。私は学ぶべきことがたくさんある。 – ibukun

答えて

-1

私はセット算術使用します。二つのゼロからなる行があなたに(入力された後、直ちに中止する
1.原因テストケースの処理:あなたが不足しているもの

import java.util.*; 

public class CD { 

public static void main(final String[] args) { 
    try (final Scanner in = new Scanner(System.in);) { 

     final int nJacks = in.nextInt(); 
     final int nJills = in.nextInt(); 
     final Set<Integer> jacks = new HashSet<>(); 
     final Set<Integer> jills = new HashSet<>(); 

     for (int i = 0; i < nJacks; i++) { 
      jacks.add(in.nextInt()); 
     } 
     for (int i = 0; i < nJills; i++) { 
      jills.add(in.nextInt()); 
     } 

     jacks.retainAll(jills); 

     System.out.println(jacks.size()); 
    } 
} 
} 
+0

2番目のテストケースが失敗して問題を解決するとは思ってもいませんが。 –

0

をするメカニズムですそのような行はテストケースとして処理されますが、そうであってはいけません)
2.複数のテストケースの実行を可能にする

ここでは完全なコード解決策があります。 mainメソッドにあるwhileループ):

import java.util.Scanner; 

public class CD { 

    public static void main(String[] args) { 
     final Scanner input = new Scanner(System.in); 
     int numberOfCdsJackOwns = input.nextInt(); 
     int numberOfCdsJillOwns = input.nextInt(); 
     while(!(numberOfCdsJackOwns == 0 && numberOfCdsJillOwns == 0)) { 
      executeTestCase(input, numberOfCdsJackOwns, numberOfCdsJillOwns); 
      numberOfCdsJackOwns = input.nextInt(); 
      numberOfCdsJillOwns = input.nextInt(); 
     } 
     input.close(); 
    } 

    private static void executeTestCase(Scanner input, int numberOfCdsJackOwns, 
    int numberOfCdsJillOwns) { 
     int numberOfCdsThatBothOwn = 0; 
     final int[] jackCds = new int[numberOfCdsJackOwns]; 
     final int[] jillCds = new int[numberOfCdsJillOwns]; 
     for(int currentIndex = 0; currentIndex < numberOfCdsJackOwns; currentIndex++) { 
      jackCds[currentIndex] = input.nextInt(); 
     } 
     for(int currentIndex = 0; currentIndex < numberOfCdsJillOwns; currentIndex++) { 
      jillCds[currentIndex] = input.nextInt(); 
     } 
     int currentJackIndex = 0; 
     int currentJillIndex = 0; 
     while(currentJackIndex < numberOfCdsJackOwns && 
     currentJillIndex < numberOfCdsJillOwns) { 
      if(jackCds[currentJackIndex] > jillCds[currentJillIndex]) { 
       currentJillIndex++; 
      } else if(jackCds[currentJackIndex] < jillCds[currentJillIndex]) { 
       currentJackIndex++; 
      } else { 
       numberOfCdsThatBothOwn++; 
       currentJillIndex++; 
       currentJackIndex++; 
      } 
     } 
     System.out.println(numberOfCdsThatBothOwn); 
    } 
} 
+0

私はコードが良いと思う。答えは?コードのみの回答はほとんど役に立たず、説明はしばしばです。この場合、あなたは質問者の質問に答えることはできません。「私が逃していることを教えてください。」 –

+1

@ OleV.V。ありがとう。私は元の答えに欠けているものの説明を加えました。 – User253489

関連する問題