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

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;
    }
}
复制代码

加油。

posted @   酷酷-  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示