首页 > 编程语言 > 详细

剑指offer-数组中只出现过一次的数字

时间:2020-09-17 13:46:19      阅读:51      评论:0      收藏:0      [点我收藏+]

题目地址:https://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&&tqId=11193&rp=1&ru=/activity/oj&qru=/ta/coding-interviews/question-ranking

题意:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

思路:异或相同等于0,两数相同等于0;

这样可以得出两个数 的异或结果,这两个数一定不一样,那么在按位异或时一定会有等于1的情况,我们先找到一个出现1的位置,让其他数据针对这个位分组,再进行异或,消除相同数,得到结果

 1 class Solution {
 2 public:
 3     void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
 4          int x=0;
 5            for(int i=0;i<data.size();++i){
 6             x^=data[i];
 7         }
 8         int f1=0,f2=0;
 9         int len=0;
10         while(x%2==0){
11             len++;
12             x=x>>1;
13         }
14         for(int i=0;i<data.size();++i){
15             if((data[i]>>len)%2){
16                 f1=f1^data[i];
17             }else{
18                  f2=f2^data[i];
19             }
20         }  
21         *num1=f1;
22         *num2=f2;
23     }
24 };

 

剑指offer-数组中只出现过一次的数字

原文:https://www.cnblogs.com/cutelife/p/13684469.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!