1. 程式人生 > >LeetCode演算法題-Single Number(Java實現)

LeetCode演算法題-Single Number(Java實現)

這是悅樂書的第175次更新,第177篇原創

01 看題和準備

今天介紹的是LeetCode演算法題中Easy級別的第34題(順位題號是136)。給定一個非空的整數陣列,除了一個元素外,每個元素都會出現兩次。 找到那個只出現了一次的元素。例如:

輸入:[2,2,1]
輸出:1

輸入:[4,1,2,1,2]
輸出:4

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

因為已經限定傳入的陣列不為空,所以此題不需要考慮特殊情況。

在解這道題之前,我們先來了解下Java中的異或(^)運算,它的計算規則是轉換為二進位制數後,兩邊的對應位不同時,取1,否則取0。如果遇到負數,需要用負數的補碼進行計算。

當兩個相同的數做異或運算時,他們運算後的結果是0。

當0和一個非零的數進行異或運算時,運算結果是那個非零的數。

此題中,重複的元素都是出現兩次,只會有一個元素只出現一次,那麼對所有的元素進行異或運算,最後得到的結果就是那個只出現了一次的元素。

public int singleNumber(int[] nums) {
    int result = 0;
    for(int n : nums){
        result ^= n;
    }
    return result;
}

此解法的時間複雜度是O(n),看見覆雜度是O(1)。

03 第二種解法

我們可以先對陣列進行升序排序,排序後出現兩次的元素肯定是相鄰的元素,對此可以使用count記數和相鄰元素比較的方法,來找出只出現了一次的元素。

第一次迴圈,count為1,此時需要判斷i+1是否等於陣列長度或者當前元素不等於後一元素,如果滿足,那麼再判斷此時的count是否等於1,如果等於1,那麼當前元素就是那個只出現了一次的元素,否則count重置為0,然後繼續迴圈。

public int singleNumber2(int[] nums) {
    Arrays.sort(nums);
    int count = 0;
    for (int i = 0; i < nums.length; i++) {
        count++;
        if (i + 1 == nums.length || nums[i] != nums[i + 1]) {
            if (count == 1) {
                return nums[i];
            }
            count = 0;
        }
    }
    return -1;
}

04 小結

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!