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)。

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

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

    136. 只出现一次的数字 136. 只出现一次的数字 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素.说明:你的算法应该具有线性时间复杂度. 你 ...

  2. Java实现 LeetCode 260 只出现一次的数字 III(三)

    260. 只出现一次的数字 III 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出 ...

  3. LeetCode 260. 只出现一次的数字 III(位运算)

    1. 题目 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 :输入: [1,2,1,3,2,5] 输出: [3,5] 注意: 结 ...

  4. Leecode 260. 只出现一次的数字 III——Leecode每日一题系列

    今天是坚持每日一题打卡的第六天 题目描述 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素.你可以按 任意顺序 返回答案. 进阶:你的算法 ...

  5. 260. 只出现一次的数字 III 【位运算】

    https://leetcode-cn.com/problems/single-number-iii/ 首先成对的都会删除.只会剩下两个不是一对的数. 首先不难看出 两个数不同,异或后一定会有一个1. ...

  6. Leetcode 260. 只出现一次的数字 III 解题思路及C++实现

    解题思路: 这道题真有点玄乎,请看:https://blog.csdn.net/smile_watermelon/article/details/47750249 先mark,之后再仔细研究. cla ...

  7. leetcode 260. Single Number III | 260. 只出现一次的数字 III(位运算:分组异或)

    题目 https://leetcode.com/problems/single-number-iii/ 题解:分组异或 参考1:讨论区题解 you know you can eliminate dou ...

  8. Leetcode 260. 只出现一次的数字 III

    原题链接 解法:异或操作 vector<int> findNumsAppearOnce(vector<int>& nums) {int eO = 0, eOhasOne ...

  9. Leetcode-260. 只出现一次的数字 III

    题目链接:Leetcode260 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出: ...

  10. leetcode-260.只出现一次的数字 III 解法

    给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出: [3,5] 注意: 结果输出的顺 ...

最新文章

  1. python自动输出_python自动化报告的输出
  2. Java 地位不保,落后已成定局 ?| 10月编程语言排行
  3. Leetcode 860. 柠檬水找零 解题思路及C++实现
  4. mysql数据库没启动命令_mysql数据库服务启动和停止命令介绍(转载)
  5. AI应用开发实战 - 手写识别应用入门
  6. IOS 控件 - 去除 tableView 多余的横线
  7. vlan间访问控制的三种方法
  8. 大牛逝世 = 新人上位 = 科学进步?新研究表明确实如此
  9. 谷歌浏览器无网络连接 打不开网页解决办法
  10. node-gulp插件
  11. 视频服务器读取hdfs文件,基于HDFS的流媒体服务器Red5视频文件分发的研究与应用...
  12. 【转载】中国煤层气资源量
  13. java 枚举实例化_Java枚举
  14. python制作日历并保存成excel_Python+Excel制作精美壁纸日历,任意DIY
  15. 菱形的常见图案_菱形图案,简约而不简单
  16. IO流实现写入规定的acci码值
  17. Android 生成自己的签名key(releasekey platform shared media networkstack verify等)
  18. CalibrateIO
  19. 什么是WRAP认证?WRAP认证详解
  20. java错误: xxx不是抽象的, 并且未覆盖xxx中的抽象方法

热门文章

  1. MCU 8080规格LCD屏显示优化——RGB666
  2. 《Spring实战》读书笔记-第6章 渲染Web视图
  3. 51单片机数据存储器扩展实验(汇编)
  4. vue图片加载不出来的问题
  5. Win10+阿里云ECS+Hexo搭建个人博客笔记
  6. 什么是Liunx?什么是Shell脚本?Liunx的应用、Shell脚本编写与应用
  7. JAVA常用数据结构
  8. Win10系统导出证书私钥及公钥
  9. C++ 赛码打字编程题
  10. ps怎么制作流体_如何在PS中制作流体效果的字体