剑指offer——62数组种数字出现的次数
题目描述
题解:
我们想到异或运算的一个性质:
任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些成对出现两次的数字全部在异或中抵消了。
我们试着把原数组分成两个子数组,使得每个子数组包含一个只出现一次的数字,而其他数字都成对出现两次。如果能够这样拆分成两个数组,那么我们就可以按照前面的办法分别找出两个只出现一次的数字了。
我们还是从头到尾依次异或数组中的每个数字,那么最终得到的结果就是两个只出现一次的数字的异或结果,因为其他数字都出现了两次,在异或中全部抵消了。由于这两个数字肯定不一样,那么异或的结果肯定不为0,也就是说,在这个结果数字的二进制表示中至少有一位为1。我们在结果数字中找到第一个为1的位的位置,记为第n位。
现在我们以第n位是不是1为标准把原数组中的数字分成两个子数组,第一个子数组中每个数字的第n位都是1,而第二个子数组中每个数字的第n位都是0。
由于我们分组的标准是数字中的某一位是1还是0,那么出现了两次的数字肯定被分配到同一个子数组。因为两个相同的数字的任意一位都是相同的,我们不可能把两个相同的数字分配到两个子数组中去,于是我们已经把原数组分成了两个子数组,每个子数组都包含一个只出现一次的数字,而其他数字都出现了两次。
 class Solution {
 public:
     void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
         if (data.size() == )return;
         int resultExclusiveOR = ;
         for (auto a : data)resultExclusiveOR ^= a;
         unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);
         *num1 = *num2 = ;
         for (auto a:data)
         {
             if (IsBit1(a, indexOf1))
                 *num1 ^= a;
             else
                 *num2 ^= a;
         }
     }
     // 找到num从右边数起第一个是1的位
     unsigned int FindFirstBitIs1(int num)
     {
         int indexBit = ;
         while (((num & ) == ) && (indexBit <  * sizeof(int)))
         {
             num = num >> ;
             ++indexBit;
         }
         return indexBit;
     }
     // 判断数字num的第indexBit位是不是1
     bool IsBit1(int num, unsigned int indexBit)
     {
         num = num >> indexBit;
         return (num & );
     }
 };
剑指offer——62数组种数字出现的次数的更多相关文章
- 【位运算】剑指offer 56. 数组中数字出现的次数
		这是一系列位运算的题目,本文将由浅入深,先从最简单的问题开始: 问题1: 一个数组中只有一个数字出现过1次,其余数字都出现过两次,请找到那个只出现1次的数字.要求时间复杂度是 \(O(n)\),空间复 ... 
- [剑指Offer]56-数组中数字出现的次数(位运算)
		题目一 数组中只出现一次的数字 题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字 题解 异或. 先考虑:数组中只有一个数字只出现了一次,其他数字都出现了 ... 
- 剑指Offer - 九度1349 - 数字在排序数组中出现的次数
		剑指Offer - 九度1349 - 数字在排序数组中出现的次数2013-11-23 00:47 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n, ... 
- 5.1 剑指 Offer 03. 数组中重复的数字
		类型题:剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ... 
- 剑指Offer:数组中出现次数超过一半的数字【39】
		剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ... 
- 《剑指offer》数组中只出现一次的数字
		本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ... 
- 剑指 Offer 62. 圆圈中最后剩下的数字 + 约瑟夫环问题
		剑指 Offer 62. 圆圈中最后剩下的数字 Offer_62 题目描述 方法一:使用链表模拟 这种方法是暴力方法,时间复杂度为O(nm),在本题中数据量过大会超时. 方法二:递归方法 packag ... 
- 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法
		剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ... 
- 剑指 Offer 03. 数组中重复的数字
		剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ... 
随机推荐
- HTML5: HTML5 应用程序缓存
			ylbtech-HTML5: HTML5 应用程序缓存 1.返回顶部 1. HTML5 应用程序缓存 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线 ... 
- (10)C++ 使用类
			一.运算符重载 1. #include<iostream> using namespace std; class Sum { int add; public: Sum(int add) { ... 
- 95、自然语言处理svd词向量
			import numpy as np import matplotlib.pyplot as plt la = np.linalg words = ["I","like& ... 
- Jsoup爬虫任务总结
			这两周由于公司需要大量数据爬取进数据库给用户展示素材,在不停的做爬虫工作,现在总算基本完成就剩清理数据的工作: 公司有一个采集器管理后台的项目,可以直接把爬虫代码打包成jar导入进去设置定时参数即可: ... 
- Darknet YOLOv3 on Jetson Nano
			推荐比较好的博客:https://ai4sig.org/2019/06/jetson-nano-darknet-yolov3/ 用的AlexeyAB的版本,并且给出了yolov3和tiny的效果对比. ... 
- 《代码大全2》读书笔记  Week9
			本周阅读了<代码大全2>第14章至第17章,这几章对我们熟悉的直线型代码.条件语句.循环语句和一些不常用的控制结构(如goto.try-catch结构)提出了一些使用建议,以下分享条件语句 ... 
- 处理CSS前缀问题的神器——AutoPrefixer
			众所周知为兼容所有浏览器,有的CSS属性需要对不同的浏览器加上前缀,然而有时添加一条属性,需要添加3~4条类似的属性只是为了满足浏览器的兼容,这不仅会增加许多的工作量. What is AutoPre ... 
- ORA-01000 error
			ORA-01000是最大开放游标错误,是Oracle数据库开发中极为常见的错误. 在Java的上下文中,当应用程序尝试打开更多ResultSet而不是数据库实例上的已配置游标时,会发生这种情况. 解决 ... 
- 【网页布局基础】css布局学习总结
			三种定位机制 1.标准文档流:从上到下,从左到右输出文档内容 2.浮动 3.绝对定位 需要注意的是块级元素如div p ul 等 行级元素如span strong img input等 块级元素与行级 ... 
- Spring boot ----RestTemplate学习笔记
			****spring boot-----restTemplate 封装了HttpURLConnection,HttpClient,Netty等接口访问实现库 restTemplet包含以下部分 Htt ... 
