2017-02-17 88 views
-5

這是我試圖解決凱迪的挑戰。 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 請你能告訴我我失蹤了什麼嗎?

謝謝。

我也使用hashSet存儲插孔cds,然後增加一個計數器,如果該集合包含任何Jills cds。 該解決方案也失敗了第二個測試用例。

+8

歡迎來到Stack Overflow!它看起來像你需要學習使用調試器。請幫助一些[互補調試技術](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。如果您之後仍然有問題,請隨時返回更多詳情。 –

+0

非常感謝。我有很多要學習的。 – ibukun

回答

-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

雖然我不希望它解決第二個測試用例失敗的問題。 –

0

什麼你缺少的是一種機制:
1.原因測試用例處理立即停止包括輸入兩個零的行之後(與您方法,這樣的線被處理爲一個測試用例但不應該是)
2.允許多於一個測試用例的執行

下面是一個完整碼溶液(和使用這種方法,這樣的機構由於存在在主要方法中的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

相關問題