LeetCode演算法題-Single Number(Java實現)
阿新 • • 發佈:2018-12-22
這是悅樂書的第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 小結
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支援!