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))
    }
}
posted @ 2020-11-04 12:45  ganshuoos  阅读(70)  评论(0编辑  收藏  举报