【算法】【线性表】【数组】只出现一次的数字 II

发布时间 2024-01-07 22:43:18作者: 酷酷-

1  题目

给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。

有关位运算的知识:https://leetcode.cn/circle/discuss/CaOJ45/

示例 1:

输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。

示例 2:

输入:nums = [-1,0]
输出:[-1,0]

示例 3:

输入:nums = [0,1]
输出:[1,0]

提示:

  • 2 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • 除两个只出现一次的整数外,nums 中的其他数字都出现两次

2  解答

class Solution {
    public int[] singleNumber(int[] nums) {
        // 这个就跟我们上节看到的异或的特性有关了
        int one = 0;
        for (int num : nums) {
            one ^= num;
        }
        // 假如那两个数是 a,b 那么现在 one = a ^ b
        // 并且 one 肯定不为0,因为 a不等于b
        // 那么怎么把 a,b拆到不同的数组里边,并且其他出现两次的都能划分到一个数组里
        // 那么 a,b哪里不同呢?就是one的结果 每一个位上等于1的就能区分a,b
        // 从 one 随机取一个位不等于0的,取低位的巧妙方法
        int flag = one & -one;
        int[] res = new int[2];
        for (int num : nums) {
            if ((num & flag) == 0) {
                res[0] ^= num;
            } else {
                res[1] ^= num;
            }
        }
        return res;
    }
}

加油。