zoukankan      html  css  js  c++  java
  • C语言编程 找出数列中只出现一次的两个数

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

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

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

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

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

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

    源代码:

    #define _CRT_SECURE_NO_WARNINGS 1
    #include<stdio.h>
    #include<stdlib.h>
    
    int Find1(int a[],int length)
    {
        int result=0,i;
        for (i = 0; i < length; i++)
        {
            result^= a[i];
        }
        return result;
    }
    void Find2(int result,int a[], int length, int *k1, int *k2)
    {
        int i=0,j;
        while (((result >> i) & 1) != 1)
        {
            i++;
        }
        for (j = 0; j < length; j++)
        {
            if (((a[j] >> i )& 1 )== 1)
            {
                * k1 ^= a[j];
            }
            if (((a[j] >> i) & 1 )== 0)
            {
                * k2 ^= a[j];
            }
        }
    }
    int main()
    {
        int arr[] = { 1, 3, 5, 7, 1, 3, 5, 9 };
        int length = sizeof(arr) / sizeof(arr[0]);
        int num1=0, num2=0;
        int * k1 = &num1, * k2 = &num2;
        Find2(Find1(arr, length), arr, length, k1, k2);
        printf("%d %d
    ",num1,num2);
        system("pause");
        return 0;
    }
  • 相关阅读:
    学习java随笔第五篇:流程控制
    学习java随笔第四篇:运算符
    学习java随笔第三篇:java的基本数据类型
    知识精简
    性能优化(详细)
    2,8,10,16进制转换
    前端优化35例
    性能优化
    字面量自定义事件

  • 原文地址:https://www.cnblogs.com/Kaniso-Vok/p/13756245.html
Copyright © 2011-2022 走看看