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

原题:
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。
找出这两个只出现一次的数字,编程实现。

此题要用到在数列中找出只出现一次的一个数字的方法
参考https://blog.51cto.com/14232799/2382172

此题明显无法一次性将两个数都找出,所以需要将数列分为两部分,每一部分有一个只出现一次的数,那么此时需要的就是分离数列的条件。

沿用找出一个数时的思想,将数列进行相互异或,但这次所得的值不是只出现一次的那个数了,因为只出现一次的数有两个,所以此次计算得到的是只出现一次的两个数的异或值。

在得到这个值后进行分析,假如得到值是4,二进制码是0100
参照异或的定义,0代表此位两个数的值相同,1代表此位两个数的值不同。
eg:
只出现一次的两个数是2和6
2的二进制码是
0010
6的是
0110
计算得到的值(两个数异或)就是0100,表示第三个二进制位两个数不同

得到了此条件,就可以将数列分为第三个二进制位为1第三个二进制位为0两个数列
再将每个数列采用找出一个数字的方法找出数字即可。

源代码:

#include<stdio.h>
#include<stdlib.h>
int First(int arr[], int length)//得到只出现一次的两个数的异或
{
    int i,result=0;
    for (i = 0; i < length; i++)
    {
        result ^= arr[i];
    }
    return result;
}
void Second(int arr[],int i,int length,int* num1, int* num2)//将数列分为两个数列而且找出数字
{
    int j;
    for (j = 0; j < length; j++)
    {
        if (arr[j] >> i == 0)//分离条件
        {
            *num1 ^= arr[j];
        }
        if (arr[j] >> i == 1)//同上
        {
            *num2 ^= arr[j];
        }
    }
}
int main()
{
    int i = 0,num1=0,num2=0;//i用来存储二进制位上哪一位两个只出现一次的的数字是不同的
    int* k1=&num1,* k2=&num2;//存储要找的两个数
    int arr[] = { 1, 4, 6, 8, 2, 8, 4, 1 };
    int length = sizeof(arr) / sizeof(arr[0]);
    int result = First(arr, length);
    while (((result >> i) & 1)==0)//找出异或值中二进制序列不同是在哪一位
    {
        i++;
    }
    Second(arr,i,length,k1,k2);//数列分离为两个数列和找出数字
    printf("两个数字为%d和%d", num1, num2);
    system("pause");
    return 0;
}

原文地址:https://blog.51cto.com/14232799/2389525

时间: 2024-10-31 09:02:47

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

C语言编程 找出数列中只出现了一次的数字(其他所有数字都是成对出现)

仅限于此题,最好的解决方案是使用按位异或的计算方法来计算 使用的是按位异或计算时"相同的数字计算会得到0,0和任何数字按位异或计算得到的是任何数字"的特性. 源代码: #include<stdio.h> #include<stdlib.h> int rearch(int array[],int length) { int i,result=0; for (i = 0; i < length; i++) { result ^= array[i];//将所有数

剑指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

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

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

40 - 找出数组中只出现一次的数字

题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.编写程序找出这个两个只出现一次的数字.要求时间复杂度O(n),空间复杂度O(1). 如 {2,4,3,6,3,2,5,5},输出{4,6} 解析: 空间复杂度为O(1)断绝了用hash-table的思路,时间复杂度O(n)断绝排序的思路. 如何判断一个数字出现2次呢? 计数 异或:如果出现2次,任意数字和自己异或都为0 异或的性质: 任何数字和 0 异或,都为它本身. 任意数字和自己异或都为0. 由于成对出现的元素异或结果为 0

LeetCode&mdash;&mdash;Single Number(找出数组中只出现一次的数)

问题: Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?   分析: 数组中的数除了一个只出现了一次之外,其它都出现了两次, 要找出只出

LeetCode&mdash;&mdash;Single Number II(找出数组中只出现一次的数2)

问题: Given an array of integers, every element appears three times except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?   Single Number I 升级版,一个数组中其它数出现了

找出数组中只出现一次的数字

题目 : 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 解析 首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身.异或运算满足交换律结合律. 当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了. 依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组.我们首先还是先异或,剩下的数字肯定是A.B异或的结果,这个结果的二进制中的1,表现的是A和B的不同的位.我们就取第

找出数组中只出现一次的数

这个题目有三种变形. 第一种,一个数组中所有数都出现了两次,只有一个数出现了一次,求这个数.这个题比较简单,只要知道数字间异或的特性,就可以很容易的得出答案. int find_num_appear_once(int *data, int length){ if(data==NULL || length==0)return; int i=0; int res=0; for(;i<length;i++){ res ^= data[i]; } return res; } 第二种,一个数组中所有的数都

面试题:找出数组中只出现一次的数字(二)

难度:中等 一个整数数组,除了一个数之外所有数字都出现了3次,找出这个数字来. 注意: 你的算法应该是线性运行复杂度,且不能使用额外内存空间. 答案: public class Solution { public int singleNumber(int[] nums) { int ones = 0, twos = 0, threes = 0; for (int i = 0; i < nums.length; i++) { // twos holds the num that appears t