260. 只出现一次的数字 III【我亦无他唯手熟尔】

简介: 260. 只出现一次的数字 III【我亦无他唯手熟尔】

260. 只出现一次的数字 III

260. 只出现一次的数字 III
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
进阶:你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
示例 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 中的其他数字都出现两次

题解

思路
暴力解法
class Solution {
    public int[] singleNumber(int[] nums) {
        int [] result=new int [2];
        int n=nums.length;
        int k=0;
        for(int i=0;i<n;i++){
            int showup=0;
            for(int j=0;j<n;j++){
                if(i==j){
                    continue;
                }else{
                    if(nums[i]==nums[j]){
                        showup=1;
                        break;
                    }
                }
            }
            if(showup==0){
                result[k]=nums[i];
                k++;
            }
        }
        return result;
    }
}



官方

在理解如何使用位运算解决本题前,读者需要首先掌握「136. 只出现一次的数字」中的位运算做法。

136. 只出现一次的数字【我亦无他唯手熟尔】
假设数组 nums 中只出现一次的元素分别是 x1 和 x2 。如果把 nums 中的所有元素全部异或起来,得到结果 x,那么一定有:

x = x1 ⊕ x2


其中 ⊕ 表示异或运算。这是因为 nums 中出现两次的元素都会因为异或运算的性质 a⊕b⊕b=a 抵消掉,那么最终的结果就只剩下x1和x2 的异或和。


x 显然不会等于 0,因为如果x=0,那么说明 x1 = x2


这样 x1 和 x2就不是只出现一次的数字了。

因此,我们可以使用位运算 x & -x 取出 x 的二进制表示中最低位那个 1,设其为第 l位,那么 x1 ⊕和x2中的某一个数的二进制表示的第 l位为 0,另一个数的二进制表示的第 l 位为 1。在这种情况下, x1 ⊕ x2的二进制表示的第 l位才能为 1。


这样一来,我们就可以把nums 中的所有元素分成两类,其中一类包含所有二进制表示的第 l 位为 0 的数,另一类包含所有二进制表示的第 l 位为 1 的数。可以发现:


对于任意一个在数组nums 中出现两次的元素,该元素的两次出现会被包含在同一类中;


对于任意一个在数组 nums 中只出现了一次的元素,即 x1 和 x2,它们会被包含在不同类中。


因此,如果我们将每一类的元素全部异或起来,那么其中一类会得到 x1 ,另一类会得到 x2 。这样我们就找出了这两个只出现一次的元素。


作者:LeetCode-Solution

链接:https://leetcode-cn.com/problems/single-number-iii/solution/zhi-chu-xian-yi-ci-de-shu-zi-iii-by-leet-4i8e/

来源:力扣(LeetCode)

class Solution {
    public int[] singleNumber(int[] nums) {
        int xorsum = 0;
        for (int num : nums) {
            xorsum ^= num;
        }
        // 防止溢出
        int lsb = (xorsum == Integer.MIN_VALUE ? xorsum : xorsum & (-xorsum));
        int type1 = 0, type2 = 0;
        for (int num : nums) {
            if ((num & lsb) != 0) {
                type1 ^= num;
            } else {
                type2 ^= num;
            }
        }
        return new int[]{type1, type2};
    }
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。
  • 空间复杂度:O(1)。

相关文章
|
Kubernetes Linux 虚拟化
一文详解容器技术简介和基本原理
本文全面阐述了容器技术的发展历程、关键技术、架构和当前的行业生态,特别是容器技术在云环境中的应用和演进。
7666 9
基于DEM提取坡度、坡向方法汇总
基于DEM提取坡度、坡向方法汇总
1469 0
基于DEM提取坡度、坡向方法汇总
|
机器学习/深度学习 运维 监控
什么是用户实体行为分析(UEBA)
数字新时代正在加速全面到来,网络环境变得更加多元、人员变得更复杂、接入方式多种多样,网络边界逐渐模糊甚至消失,同时伴随着企业数据的激增。数字化转型促进组织的业务发展的同时,也带来了重大的网络安全挑战。安全是人和人攻防对抗的游戏,一切的意图都需要通过行为表达,这是安全运营中最重要也最有价值的一块拼图,同时也是传统方式最欠缺的。针对传统方式的不足,安全行业逐步加强基于大数据驱动,机器学习、概率分析、模式识别等的以“行为”为核心的检测分析。 用户实体行为分析(UEBA)应运而生。
3203 1
|
机器学习/深度学习 人工智能 安全
一文搞懂隐私计算
一文搞懂隐私计算
5067 0
|
存储 应用服务中间件 nginx
一文搞清楚 Docker 镜像、容器、仓库
Docker 镜像、容器、仓库是 Docker 技术中的三个重要概念.....
8910 1
一文搞清楚 Docker 镜像、容器、仓库
|
机器学习/深度学习 人工智能 安全
人工智能安全(上)
人工智能安全(上)
678 0
人工智能安全(上)
|
4天前
|
人工智能 自然语言处理 JavaScript
2026年Windows+Ollama本地部署OpenClaw保姆级教程:本地AI Agent+阿里云上快速搭建
2026年OpenClaw凭借本地部署、私有化运行的特性,成为打造个人智能体的核心工具,而Ollama作为轻量级本地大模型管理工具,能让OpenClaw摆脱对云端大模型的依赖,实现**本地推理、数据不泄露、全流程私有化**的智能体验。本文基于Windows 11系统,从硬件环境准备、Ollama安装与模型定制、OpenClaw部署配置、技能扩展到常见问题排查,打造保姆级本地部署教程,同时补充阿里云OpenClaw(Clawdbot)快速部署步骤,兼顾本地私有化需求与云端7×24小时运行需求,文中所有代码命令均可直接复制执行,确保零基础用户也能快速搭建属于自己的本地智能体。
5937 32
|
5天前
|
人工智能 JSON JavaScript
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人
手把手教你用 OpenClaw(v2026.2.22-2)+ 飞书,10分钟零代码搭建专属AI机器人!内置飞书插件,无需额外安装;支持Claude等主流模型,命令行一键配置。告别复杂开发,像聊同事一样自然对话。
2654 7
手把手教你用 OpenClaw + 飞书,打造专属 AI 机器人

热门文章

最新文章