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

简介: /*一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思路:如果是只有一个数字出现一次,那么所有数字做异或就得到结果;现在有两个数字x,y分别出现一次,其他数字出现两次,那么所有数字异或的结果是result = x^yx^y肯定不等于0,那么找其二进制表示中不等于0的一个位,比如从右到左第一个位置好了,那么用这个位置能区分开来这两个数字,以及其他的数字,每两个一样的数字都处于同一边。

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

思路:
如果是只有一个数字出现一次,那么所有数字做异或就得到结果;
现在有两个数字x,y分别出现一次,其他数字出现两次,那么所有数字异或的结果是result = x^y
x^y肯定不等于0,那么找其二进制表示中不等于0的一个位,比如从右到左第一个位置好了,那么用这个位置能区分开来这两个数字,以及其他的数字,每两个一样的数字都处于同一边。
*/
class Solution {
public:
    void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
        int res = data[0];
        for (int i = 1; i < data.size(); i++){
            res = res ^ data[i];
        }
        int cnt = 0;
        while (res % 2 != 1){
            res = res >> 1;
            cnt = cnt + 1;
        }
        *num1 = *num2 = 0;
        for (int i = 0; i < data.size(); i++){
            if ((data[i] >> cnt) & 1){
                *num1 ^= data[i];
            }
            else{
                *num2 ^= data[i];
            }
        }
    }
};
目录
相关文章
【剑指offer】-数组中只出现一次的数字-35/67
【剑指offer】-数组中只出现一次的数字-35/67
|
4月前
|
Java
每日一题《剑指offer》数组篇之数组中只出现一次的两个数字
每日一题《剑指offer》数组篇之数组中只出现一次的两个数字
16 0
每日一题《剑指offer》数组篇之数组中只出现一次的两个数字
|
4月前
|
Java
每日一题《剑指offer》数组篇之旋转数组的最小数字
每日一题《剑指offer》数组篇之旋转数组的最小数字
23 0
每日一题《剑指offer》数组篇之旋转数组的最小数字
|
4月前
|
Java
每日一题《剑指offer》数组篇之数组中重复的数字
每日一题《剑指offer》数组篇之数组中重复的数字
36 0
每日一题《剑指offer》数组篇之数组中重复的数字
|
4月前
|
Java
每日一题《剑指offer》数组篇之和为S的两个数字
每日一题《剑指offer》数组篇之和为S的两个数字
29 0
每日一题《剑指offer》数组篇之和为S的两个数字
|
7月前
剑指offer-1.找出数组中重复的数字
剑指offer-1.找出数组中重复的数字
14 0
|
10月前
剑指offer 62. 数组中唯一只出现一次的数字
剑指offer 62. 数组中唯一只出现一次的数字
48 0
|
10月前
剑指offer 61. 数组中只出现一次的两个数字
剑指offer 61. 数组中只出现一次的两个数字
40 0
剑指offer 61. 数组中只出现一次的两个数字
|
10月前
|
存储
剑指offer 63. 和为S的两个数字
剑指offer 63. 和为S的两个数字
53 0
|
10月前
|
C++
剑指offer 01. 找出数组中重复的数字
剑指offer 01. 找出数组中重复的数字
35 0