1. 程式人生 > 實用技巧 >leetcode刷題筆記 260題 只出現一次的數字 III

leetcode刷題筆記 260題 只出現一次的數字 III

leetcode刷題筆記 260題 只出現一次的數字 III

源地址:260. 只出現一次的數字 III

問題描述:

給定一個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。

示例 :

輸入: [1,2,1,3,2,5]
輸出: [3,5]
注意:

結果輸出的順序並不重要,對於上面的例子, [5, 3] 也是正確答案。
你的演算法應該具有線性時間複雜度。你能否僅使用常數空間複雜度來實現?

/*
對於可重複出現2次或偶數次的數,需要考慮到異或方法
由於本題存在兩個只出現一次的數,因此對全部數異或的話,最終結果為兩個只出現一次的數的異或
由於這兩個數不相同,其二進位制表達至少存在一位不同
對ab異或結果逐位與1取,獲取區別位
而後對整個nums總右移K位(即區別位)與1取或值為0 或為1的所有數進行異或,最終結果可以分別得到兩個只出現一次的數
*/
object Solution {
    def singleNumber(nums: Array[Int]): Array[Int] = {
        var ab = 0
        for (num <- nums) {
            ab ^= num
        }
        
        var k = 0
        while ((ab >> k & 1) == 0) k += 1

        def get(nums: Array[Int], k: Int, t: Int): Int = {
            var res = 0
            for (num <- nums) {
                if ((num >> k & 1) == t){
                    res ^= num
                } 
            }
            return res
        }

        return Array(get(nums, k, 0), get(nums, k, 1))
    }
}