找出一组数中只出现一次的两个数,其他所有数都是成对出现的

题目:

给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数。编写函数实现。

题目分析:

上次介绍了,对于一组数中只有一个数只出现一次,其他所有数都是成对出现的,我们采用了对全部数组元素进行异或,但是对于找出两个出现一次的数应该怎么解决呢?先对所有的元素进行异或,则结果为两个出现一次的数的异或结果,然后将结果转换为二进制,找出二进制数中的第一个1,然后根据这个1的判断条件进行分组,分为两组,分别对两个组的元素进行全部异或,则就找出两个不同的数。

例如:数组中的元素为下面这些数:

0000      --0

0000      --0

0001      --1

0001      --1

0010      --2

0011      --3

0011      --3

0100      --4

0100      --4

0101      --5

全部元素异或的结果为:0111    以最后面的1为条件,分为第一组(1、1、3、3、5)和第二组(0、0、2、4、4),分别对两组元素进行全部异或。

下面是具体的程序:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
 
int find_get(int num)    //转换为二进制
{
    int get = 0; 
    while(num)
    {    
        if(num % 2 == 1)   //返回转换的二进制中出现第一个的位数
        {
            return get;
         }
        get++;
        num = num / 2;
     }
return -1;
}
 
void find_num(int arr[], int ret, int *p, int *q)
{
     int i = 0;
     int find = 0;
     int pos = 0;
     for(i = 0; i < ret; i++)   //将所有的数字异或,得到find
     {
         find ^= arr[i];
     }
     pos = find_get(find);
     for(i = 0; i < ret; i++)
     {
         if (1 & (arr[i] >> pos))
         {
             *p ^= arr[i];
         }
         else
         {
            *q ^= arr[i];
         }
     }
}
 
int main()
{
     int arr[] = {1,1,2,2,3,3,4,5};
     int ret = sizeof(arr) / sizeof(arr[0]);
     int find = 0;
     int num1 = 0;
     int num2 = 0;
     printf("输出只出现一次的数字:\n");
     find_num(arr, ret, &num1, &num2);
     printf("%d   %d", num1, num2);
     system("pause");
     return 0;
 
}
时间: 2024-10-16 21:55:43

找出一组数中只出现一次的两个数,其他所有数都是成对出现的的相关文章

找出十进制数中出现的&#39;&#39;一&#39;&#39;的个数

一.题目要求: 给定一个十进制的正整数,写下从1开始,到N的所有整数,然后数一下其中出现“1”的个数. 要求: 1.写一个函数 f(N) ,返回1 到 N 之间出现的“1”的个数.例如 f(12)  = 5. 2.在32位整数范围内,满足条件的“f(N) =N”的最大的N是多少. 二.解决思路 通过列举几个数进行计算,可以发现函数f(N)规律如下: 1.一位十进制数:当N>=1时,f(N)=1:当N=0时,f(N)= 0; 2.两位十进制数:f(13)=个位出现1的个数+十位出现1的个数=2+4

剑指Offer 面试题40:数组中只出现一次的两个数 题解

面试题40:数组中只出现一次的两个数 提交网址:  http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&tqId=11193 或 http://ac.jobdu.com/problem.php?pid=1351 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 牛客网OJ的输入输出接口是:void Fin

C语言编程 找出数列中只出现一次的两个数

原题:一个数组中只有两个数字是出现一次,其他所有数字都出现了两次.找出这两个只出现一次的数字,编程实现. 此题要用到在数列中找出只出现一次的一个数字的方法参考https://blog.51cto.com/14232799/2382172 此题明显无法一次性将两个数都找出,所以需要将数列分为两部分,每一部分有一个只出现一次的数,那么此时需要的就是分离数列的条件. 沿用找出一个数时的思想,将数列进行相互异或,但这次所得的值不是只出现一次的那个数了,因为只出现一次的数有两个,所以此次计算得到的是只出现

找出一堆数中最小的前K个数

描写叙述: 给定一个整数数组.让你从该数组中找出最小的K个数 思路: 最简洁粗暴的方法就是将该数组进行排序,然后取最前面的K个数就可以. 可是,本题要求的仅仅是求出最小的k个数就可以,用排序能够但显然有点浪费.比方让求10000个整数数组中的最小的10个数.用排序的话平均时间复杂度差为Nlog(N). 于是想到了,用堆来实现,可是自己实现又太麻烦.想到了java里面的TreeSet,先将K个数放入TreeSet中.因为TreeSet会对里面的元素进行排序.所以在TreeSet中的元素是有序的.以

C++找数组中只出现一次的两个数并保存(牛客剑指offer)

//////////////////////////////////// //一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. //心得:开始我以为是只出现一次的一个数,题中确是有2个只出现一次的数 //数组从i=0,开始,另一个j=i+1开始,当出现一个相等的我就把它保存在我新建的数组里面b[n/2+1], //当j==n时,说明在i位置之后没有跟a[i]相等的数值了,但是不能保证前面没有, //于是这里我保存在b数组里面的数据就起作用了,再遍历一遍

【十一】找出一组数组中最大值、最大值的角标、最小值、最小值的角标及平均数

需求:现有一组评委打分的数据. 求出他们的最大值与最小值. 最大值最小值的角标 去除最大值与最小值后的平均数 代码: 1 <?php 2 $arr=array(1,2,3,4); 3 //最小值 4 //思路:44,5,3,333,445,99,54,332,-6 5 // 1.定义变量,一个记录下标$index,一个记录最小值$minvalue 6 // 2.假如最小值为下标为0的数 7 // 3.拿认为最小的值与该数组内的数比较 8 // 4.如果$minvalue大于数组内的某个数,则说明

找出一组数里出现频率最高的3个数(1.3)

产生一个随机数组和空字典 >>> from random import randint >>> l1 = [randint(1, 20) for x in range(60)] >>> d1 = dict.fromkeys(range(1,21), 0) print(l1) [13, 3, 12, 14, 8, 10, 11, 17, 11, 10, 6, 2, 2, 7, 12, 17, 11, 6, 4, 4, 19, 13, 18, 18, 16

找出数据集合中的最小值和最大值的两种算法比较

最小值和最大值 -- 算导笔记 实现太过于简单以至于算导里面都不讲代码实现,只是简单介绍了理论. 通常寻找最大值最小值的方法 方法一: void max_min(int* array,int size,int* max) { int tmp = 0; for(tmp = 0,*max = array[0];tmp < size;tmp++) { *max = *max > array[tmp] ? *max : array[tmp]; } } 这里如果寻找最小值同理 可以发现如果同时要求找到最

算法——一天一道算法题篇——找只出现一次的两个数

找只出现一次的两个数 题目: 一个整型数组里除了两个数字只出现一次之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 举例说明: 现在有一个数组:{1,3,4,2,4,3}; 假设数组元素的规模不是很大,想要找到只出现一次的元素,可以定义一个辅助数组,flag[100];里面存放的是数组元素出现的次数,flag数组的下标表示的是数组:{1,3,4,2,4,3}里的元素. 代码如下: package hello.ant; public class AlogArrayFind2 {