2017-08-28 42 views
1

我給了一個雙打數組,所有數字除了一個都相等。我的任務是找到唯一的號碼。我的代碼返回正確的輸出,現在我想知道如何進一步優化它。如何進一步優化我的代碼?

這是我的代碼:

public static double findUnique(double array[]) { 
    double unique = 0; 
    double common = 0; 

    for(int i=0; i<array.length; i++) { 
     for(int j=i+1; j<array.length; j++) { 
      if(array[i]==array[j]) { 
       common = array[i]; 
      } 
     } 
     if(common!=array[i]) { 
      unique = array[i]; 
     } 
    } 
return unique; 
} 

我能想到的首先是存儲數組的長度的唯一的事情,但有些測試後實際所花的時間。謝謝。

+0

好吧,現在我覺得沒有測試這個愚蠢。我在'if'語句中使用了'break',這大大減少了所需的時間。儘管如此,我仍然願意回答。 – Helquin

+2

真的很容易。看看'array [0]','array [1]','array [2]'。如果它們中的任何一個與其他的不同,則返回唯一的一個。如果全部相同,則在'array [3 ... N-1]'中搜索**不等於'array [0]'的一個元素。 –

+0

@IwillnotexistIdonotexist謝謝你的建議,我會根據這個做一個新的方法。 – Helquin

回答

3
public static double findUnique(double array[]) { 
    if(array.length < 3) { 
     throw new IllegalArgumentException("wrong array"); 
    } 

    double common; 
    if(array[0] == array[1]) { 
     common = array[0]; 
    } else { 
     return array[0] != array[2]? array[0]: array[1]; 
    } 

    for(int i=2; i<array.length; i++) { 
     if(common != array[i]) { 
      return array[i]; 
     } 
    } 
    throw new IllegalArgumentException("wrong array"); 
} 
+0

'if(array.length <3)'部分似乎是爲codewars kata製作的。仍然比我的代碼更好。 – Helquin

+0

如果(array.length <3)不需要,你可以不使用它。我寫它的一般情況下,如有可能有錯誤的論點。 –

+0

對不起,我剛纔意識到一個長度小於3的數組只有兩個不同的元素永遠不會有唯一的,也沒有公共元素。 – Helquin

2

我相信它在everey迭代中抓住兩個新數字是不必要的。

取而代之,我們可以從抓取數組的兩個第一個數字開始,然後如果這些數字相同,我們可以將其餘數字與它們的值進行比較。所以我們在for循環之上定義了我們的公共元素,這樣我們就可以避免在每次迭代中使用for循環和if語句:common = array [i]。我相信這應該在速度上有所作爲,至少如果數組是瘋狂的大的話。^^

另外,把迴路放在for循環中,這樣你就不會遍歷整個列表,即使你真的發現一塊金子:) :)。 (返回的東西總是打破整個方法。)

希望我不要錯過任何東西:)。這裏有一些代碼給你。 :)

public static double findUnique(double array[]) { 
    double common = 0; 

    if(array.length<3){ 
    throw new IllegalArgumentException("Only two numbers exsists"); 
    } 

    // Set up the common number seperately here. 
    if(array[0] == array[1]){ 
     common = array[0]; 
    } 
    else if(array[1] == array[2]){ 
     return array[0]; 
    }else{ 
     return array[1]; 
    } 
    // Now we iterate with return inside the for loop. 
    for(int i=2; i<array.length; i++) { 
     if(common!=array[i]) { 
     return array[i]; 
     } 
    } 
throw new IllegalArgumentException("All numbers are identical"); 

} 
+0

變量唯一根本不需要,可以使用只返回數組[0],返回數組[1]和返回數組[i];之後for(...)必須返回或拋出,或者你有編譯異常。 –

+1

你是對的!而你在哪裏更快! :)我的概念是健全的(希望^^)。 – Axiomel

0

如果您先排列整個陣列,該怎麼辦?然後看看數組的前兩個元素和最後一個元素。

+0

當然,它會工作,但問題是關於優化。爲了找到一個單獨的異常值(最壞情況下的N複雜度)而對整個陣列進行排序(通常爲Nlog(N)複雜度)可能不是最佳解決方案。 – GPI

+0

是的,沒錯。只是它可以兩種方式。想知道如果我們在第二個最後的位置找到獨特的元素。再想一想,你是對的,這將是一個矯枉過正的問題。 – Gautam

+0

不確定它可以「雙向」。對列表進行排序可以保證比N比較多**。查找異常值保證至多需要** N(+1)個比較。 – GPI