一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字

标签: 编程
26人阅读 评论(1) 收藏 举报
分类:

首先,一个数组里面的元素可能是奇数个也可能是偶数个。同时,判断数组里的数是否成对出现有三种情况:可能有一个单数、也可能没有、还有可能有两个单数。

当数组个数奇数时:

  • 例如{1,3,5,7,1,3,5};
    数组不全成对出现,且只可能有一个单数,全部异或的结果为那个单数。

当数组个数偶数时:

  • 例如{1,3,5,1,3,5};
    数组成对出现,全部异或的结果为0。

  • 例如{3,5,7,3, 5, 11};
    数组不全成对出现,有2个单数。
    此时,每个数依次异或的结果为:0011^0101^0111^0011^0101^1011=1100。
    因为后边两位是0,则说明两个单数是从倒数三位不同的。然后让每个数右移两位 则数据会变为
    3: 0000
    5: 0001
    7: 0001
    3: 0000
    5: 0001
    11:0010
    然后把末尾为零的依次异或 在这组数据里是3 3 11; 结果得到单数11。
    把末尾为1的依次异或 在这组数据里是5 7 5;结果得到单数7。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void find_num(int *p, int sz)
{
    int num = 0;
    int num1 = 0;
    int num2 = 0;
    int i = 0;
    int count = 0;
    int n = 0;
    if ((sz % 2) == 1)  //数组个数为奇数
    {
        for (i = 0; i < sz; i++)
        {
            num = num ^ *(p + i);    //所有数异或结果为单数
        }
        printf("单数:%d\n", num);
    }
    else          //数组个数为偶数:一种是没有单数 还有是两个单数
    {
        for (i = 0; i < sz; i++)
            num = num^ *(p + i);
        if (num == 0)            //所有数异或结果为零说明没有单数
        {
            printf("没有单数\n");
        }
        else  //有两个单数
        {
            while (!(num & 1))
            {
                count++;
                num = num >> 1;
            }
            for (i = 0; i < sz; i++)
            {
                n = p[i] >> count; //所有数异或结果后面有几个0,
                                     //每个数依次往右移动几位
                if (n & 1) //把末位为1的数依次异或
                {
                    num1 = num1 ^ *(p + i);
                }
                else  //把末位为0的数依次异或
                {
                    num2 = num2 ^ *(p + i);
                }
            }
            printf("两个单数 :\n%d\n%d\n ", num1, num2);
        }
    }
}
void display(int *p, int sz)
{
    int i = 0;
    printf("数组为:\n");
    for (i = 0; i < sz; i++)
        printf("%d ", p[i]);
    printf("\n");
}
int main()
{
    int arr[] = { 1, 3, 5, 7, 1, 8, 3, 5 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    display(arr, sz)
    find_num(arr, sz);
    system("pause");
    return 0;
}



查看评论

数字成像系统

-
  • 1970年01月01日 08:00

C语言:一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。(

#include int main() {      int arr[]={1,3,3,1,4,6,4,5,5};      int i=0;      int len=sizeof(arr)/s...
  • hanjing_1995
  • hanjing_1995
  • 2016-05-30 17:13:47
  • 1592

一组数据中只有一个数字出现一次,其他数成对出现,找出这个数

一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的,请找出这个数字。(使用位运算)直接使用异或运算。代码如下:#include #include int main() { int arr...
  • Scenlyf
  • Scenlyf
  • 2016-06-11 18:50:43
  • 239

一组数据中只有一个数字出现一次 ;其他所有数字都是成对出现的请找出这个数字。

题目: 一组数据里边数都是成对出现;里边可能有一个单数、也可能没有、还有可能有两个单数三种情况; 思想: 【一】 如果这组数是奇数个,例如{1,3,5,7,1,3,5};让每个数依次异或则就剩...
  • xiaobingRSQ
  • xiaobingRSQ
  • 2016-11-25 23:14:58
  • 381

C语言---一组数组中只有两个数字出现一次,其他数字都是成对出现的,请找出这两个数字。

啦啦啦。。。。。。。首先我们先找出:数组中只有一个数字出现一次,其余数字都成对出现。实现的方法其时间复杂度为O(1);使用异或:其数字的二进制位相同为0,不同为1.所有数字都异或,最后的异或结果就是那...
  • Yinghuhu333333
  • Yinghuhu333333
  • 2018-02-22 00:11:59
  • 25

一个数组中只有两个数字单独出现,其余数字都是成对出现的,请找出这两个数。

排序:#include #include int check(int arr[], int len) //将arr[]中的数组进行异或...
  • sinat_34967445
  • sinat_34967445
  • 2017-08-06 10:33:05
  • 188

一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。 请找出这个数字。 (使用位运算) 如: 数据:1 3 5 7 1 3 5 8 这组数据中, 只有7出现了一次。 则找出数字7

方法一: 算法思想:相当于遍历数组,所有的元素异或了一遍,而相同的两个数会抵消成0,而任意数和0异或为该数本身,所以那个单一的必定会被留下来 注意: (1)异或的特点:两个相同的数字异或必为0;0和...
  • lyl194458
  • lyl194458
  • 2016-12-03 12:39:04
  • 463

编程实现: 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。(使用位运算)

#include int main() { int arr[] = { 1, 5, 5, 1, 7, 6, 7, 8, 8,9,9}; int i = 0; int len...
  • qq_41112517
  • qq_41112517
  • 2018-01-05 18:13:22
  • 51

一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。

一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。头文件以及主函数(测试):#include #include int main() {  int arr[] = { 4...
  • no_sying_nothing
  • no_sying_nothing
  • 2016-05-29 22:49:28
  • 236

一组数据中只有一个数字出现了一次,其他数字都是成对出现,请找出这个数,(使用位运算)

#define CRT_SECURE_NO_WARNINGS 1 #include&amp;lt;stdio.h&amp;gt; #include&amp;lt;stdlib.h&amp;gt; i...
  • weixin_41318405
  • weixin_41318405
  • 2018-04-17 23:23:14
  • 1
    个人资料
    持之以恒
    等级:
    访问量: 1426
    积分: 551
    排名: 24万+
    文章分类
    文章存档
    最新评论