数组中只出现一次的数字(剑指offer)思维有点巧

数组中只出现一次的数字

  • 参与人数:1144时间限制:1秒空间限制:32768K
  • 通过比例:21.75%
  • 最佳记录:0 ms|0K(来自  牛客563536号

题目描述

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

题目链接:http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

首先题目里有个很关键的信息:除了两个数字之外,其他的数字都出现了两次。作为这题的突破口!

那么先来想想这样的情况,一个数组中,除了一个数,其他数都出现偶数次的情况!

看这题目的信息,就是透露你要用异或来求解的嘛,(偶数次异或为0),所以我们只要把整个数组都异或一次就可以解决问题了。

那么现在来想2个数的情况,有人说也都异或一遍不就好了。可是这样就得到了我们要求的那两个数的异或后的结果了,而不能得到要求的那2个数,所以还差一点点;

考虑这样一个数组:1 1 2 3 3
4 4 5 6 6                                    发现如果要求2个数分别位于2个数组中,那么2个数组分别异或就能得到解不是吗?!   就好好像两个问题一组合成问题二一样,(思想没错!)

我们知道现在最主要的问题是把原数组拆成2个问题一的数组。(eg:1 2 3 4 5 1 2 3)

这里有个小技巧:因为相同数字异或为0,不同数字异或不为0,所以结果一定不是0;设异或结果为ans,那么我们可以找到ans的二进制某一位一定为1,so。。这一位一定来自num1或者num2;所以以这一位为分界条件,把数组分成2部分,eg:ans=1;数组分成{1,3,5,3,1}和{2,4,2}
这样每个数组再异或就可以得到解了!

#include<stdio.h>
#include<vector>
using namespace std;

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int *num1,int *num2) {
        if(data.size()<2) return ;
        int ans=data[0];
        int len=data.size();
        for(int i=1;i<len;i++)
        {
            ans^=data[i];
        }

        if(ans==0) return ;//没有两个不一样的
        int f=1;
        for(int i=1;;i++)
        {
            if(f&ans) break;
            f=1<<i;
        }
//        printf("%d\n",f);
        *num1=0;
        *num2=0;
        for(int i=0;i<len;i++)
        {
            if(f&data[i])
            {
                *num1^=data[i];
            }
            else
            {
                *num2^=data[i];
            }

        }
    }
};
int main()
{
    vector<int> arr(10);
    arr[0]=1;
    arr[1]=2;
    arr[2]=3;
    arr[3]=4;
    arr[4]=5;
    arr[5]=1;
    arr[6]=2;
    arr[7]=3;
    arr[8]=7;
    arr[9]=7;
    Solution so;

    int a;
    int b;
    int *num1=&a;
    int *num2=&b;
    so.FindNumsAppearOnce(arr,num1,num2);
    printf("%d\t%d\n",*num1,*num2);
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 14:37:18

数组中只出现一次的数字(剑指offer)思维有点巧的相关文章

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

数组中只出现一次的数字 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路 先考虑一个数组里只有一个数出现一次,其他两个数都出现两次的情况:一个数跟自己异或后为0,一个数组里只有一个数出现一次其他两次,挨个异或后最后得到的结果就是只出现一次的那个数. 我们把这个数组分为两部分,每部分只有一个数只出现一次:我们分的时候,把所有数都异或后,得到的结果肯定不为0,其实是那两个只出现一次的不同的数的异或,我们从低位到高危找到第一个不为0的那位,异

编程算法 - 数组中只出现一次的数字 代码(C)

数组中只出现一次的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 一个整型数组里除了两个数字以外, 其他的数字都出现了两次. 请写程序找出这两个只出现一次的数字. 如果从头到尾依次异或数组中的每一个数字, 那么最终的结果刚好是那个只出现一次的数字. 根据结果数组二进制某一位为1, 以此分组, 为1的一组, 为0的一组, 再重新进行异或. 最后得出两个结果. 时间复杂度O(n). 代码: /* * main.cpp * * Create

剑指offer系列源码-数组中只出现一次的数字

题目1351:数组中只出现一次的数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2582解决:758 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3 2 5 5

【01】数组中只出现一次的数字

其他两次,一个一次/其他三次,一个一次/其他两次,两个一次 ============================================ 任何一个数字异或他自己都得零. 注意异或运算的初始化变量为0,因为0异或任何数字都得那个数字自身. Single Number 1.一个整型数组中除了一个数字之外,其他数字都出现了两次 ,找出这个出现一次的数字. 解法一,异或是重复的消失,剩下的就是要找的数字. C++ Code 12345678910111213   int singleNumb

【剑指offer】数组中只出现一次的数字(1)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27649027 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3

[剑指Offer]40.数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路 我们直到异或的性质: 任何一个数字异或他自己都等于0. 所以说我们如果从头到尾依次异或每一个数字,那么最终的结果刚好只出现一次的数字,因为成对出现的两次的数字全部在异或中抵消了. 这道题中有两个数字只出现一次.这样的话我们得到的结果就是这两个数字的异或结果.因此我们想办法把原数组分成两个子数组,使得每个子数组包含一个只出现一次的数字.这样我们就可以对这两个子数组分别异或,就能得到两个只出现一

【4】数组中只出现一次的数字

题目:输入一个整型数组,数组里除了两个数出现一次之外,其它所有数字出现的次数都是2次,求这两个数字.要求时间复杂度为O(n),空间复杂度为O(1) 1 题目要求时间复杂度为O(n)并且空间复杂度为O(1).这个时候朴素的方法利用数字来记录出现次数的方案都是不行的. 2 根据题目的特点,只有两个数出现一次,其它的所有数据都是出现2次.如果这两个数是a和b,那么对这个数组异或的结果就是a^b.现在我们就是要考虑怎么把数组分成两部分,一部分含有a,一部分含有b,则每部分异或的结果即为两个数a和b的值

九度OJ 1351 数组中只出现一次的数字 (位操作)

题目1351:数组中只出现一次的数字 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2597 解决:766 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3 2

34.数组中只出现一次的数字

http://zhedahht.blog.163.com/blog/static/2541117420071128950682/ http://blog.csdn.net/maoxunxing/article/details/11386407 http://zhedahht.blog.163.com/blog/static/25411174201283084246412/ http://blog.csdn.net/wuzhekai1985/article/details/6704794 题目:一