博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Single Number III 单独的数字之三
阅读量:6895 次
发布时间:2019-06-27

本文共 1302 字,大约阅读时间需要 4 分钟。

Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.

For example:

Given nums = [1, 2, 1, 3, 2, 5], return [3, 5].

Note:

  1. The order of the result is not important. So in the above example, [5, 3] is also correct.
  2. Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?

这道题是之前那两道和 的再次延伸,说实话,这类位操作Bit Manipulation的题,如果之前没有遇到过类似的题目,楞想是很难相出来的,于是我只能上网搜大神们的解法,发现还真是巧妙啊。这道题其实是很巧妙的利用了的解法,因为那道解法是可以准确的找出只出现了一次的数字,但前提是其他数字必须出现两次才行。而这题有两个数字都只出现了一次,那么我们如果能想办法把原数组分为两个小数组,不相同的两个数字分别在两个小数组中,这样分别调用的解法就可以得到答案。那么如何实现呢,首先我们先把原数组全部异或起来,那么我们会得到一个数字,这个数字是两个不相同的数字异或的结果,我们取出其中任意一位为‘1’的位,为了方便起见,我们用 a &= -a 来取出最右端为‘1’的位,然后和原数组中的数字挨个相与,那么我们要求的两个不同的数字就被分到了两个小组中,分别将两个小组中的数字都异或起来,就可以得到最终结果了,参见代码如下:

class Solution {public:    vector
singleNumber(vector
& nums) { int diff = accumulate(nums.begin(), nums.end(), 0, bit_xor
()); diff &= -diff; vector
res(2, 0); for (auto &a : nums) { if (a & diff) res[0] ^= a; else res[1] ^= a; } return res; }};

本文转自博客园Grandyang的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
Linux set命令详解:开启,关闭shell功能属性
查看>>
nagios的详细配置和报警
查看>>
MYSQL分区
查看>>
移动开发主流框架的选取以及技术选型方案解析
查看>>
Dubbo是什么
查看>>
移动营销实务十讲导读(图文版)
查看>>
linux查找文件命令find
查看>>
centos6 安装pptpd pptp*** 手册
查看>>
接触Codis&Codis-ha
查看>>
jQuery-ui 的datepicker日历插件使用clone()出来的input无法选择问题
查看>>
暂停Lotus用户
查看>>
Linux文件系统--【文件系统基本单位】
查看>>
创建型模式之二:工厂模式
查看>>
Eclipse调试Java程序的十大技巧 (Top 10 Java Debugging Tips with Eclipse)
查看>>
编程乐趣:C#实现12306自动登录(2013年11月27)
查看>>
Android开发_微信分享功能
查看>>
博客 笔记 网站小计
查看>>
Jedis基本操作(一)
查看>>
我的友情链接
查看>>
我的友情链接
查看>>