• 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))
        }
    }
    
  • 相关阅读:
    NOIP2011 D1T1 铺地毯
    NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
    POJ 2513 trie树+并查集判断无向图的欧拉路
    599. Minimum Index Sum of Two Lists
    594. Longest Harmonious Subsequence
    575. Distribute Candies
    554. Brick Wall
    535. Encode and Decode TinyURL(rand and srand)
    525. Contiguous Array
    500. Keyboard Row
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/13925320.html
Copyright © 2020-2023  润新知