2017-04-06 50 views
0

该方法应返回两个数组中找到的最小类似值。它的工作原理与此输入:Java算法错误

int[] C={1,3,2,1}; 
int[] D={4,2,5,3,2}; 

public static int getSmallestSimilar(int[] C, int[] D) { 
     int n = A.length; 
     int m = B.length; 
     Arrays.sort(A); 
     Arrays.sort(B); 
     int i = 0; 
     for (int k = 0; k < n; k++) { 
      System.out.println(B[i] +"::"+ A[k]); 
      System.out.println(i +"::"+ k); 
      if (i < m - 1 && B[i] < A[k]) 
       i += 1; 
      if (A[k] == B[i]) 
       return A[k]; 
     } 
     return -1; 
    } 

不幸的是,它不与该输入工作:

int[] A={15,9} and int[] B={6,9,3}; 

我试图解决问题,但我不能,请帮忙

+0

它不依赖于数组的大小可能与差异的大小,?我怎么能解决? –

+0

另一个问题,在同一行中 - 您提前B的索引,但只有一次。你可能会(如在这种情况下)前进到另一个也小于A值的B值。所以......考虑你是否想要一个最多执行一次的'if'语句或另一种可以执行多次的语句。 –

+0

@SalahBenAtwa - 它取决于数组大小。线部分:“如果我 Dakoda

回答

0

B为2个指数。如果只增加一次。 你的循环改为

  for (int k = 0; k < n; k++) { 
       // A[k] = 9, catch up B[i] until b is greater than or equal. 
       while (i < m - 1 && B[i] < A[k]) 
        i += 1; 
       if (A[k] == B[i]) 
        return A[k]; 
     } 
+0

等一下,我想你只想去通过一次,我会改变它 – Dakoda

+0

@SalahBenAtwa,这是否正确你的问题?如果是这样,你可以请它标记为已解决? – Dakoda

0

k应增加只有B[i]>A[k]

这个循环应该工作:

int i = 0,k = 0; 
    for (;;) { 
     if(i >= m || k >= n) 
      return -1; //or anything which implies no match found 
     System.out.println(B[i] + "::" + A[k]); 
     System.out.println(i + "::" + k); 
     if (B[i] < A[k]) 
      i += 1; 
     if (B[i] > A[k]) 
      k += 1; 
     if (A[k] == B[i]) 
      return A[k]; 
    }