【经典面试题】给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数

原创 2016年05月30日 17:15:12
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
    int ascii[255] = { 0 };
    int arr[] = { 1, 9, 1, 2, 3, 4, 4, 9};
    int len = sizeof(arr) / sizeof(arr[0]);
    int i = 0;
    for (i = 0; i < len; i++)
    {
       ascii[arr[i]] ++;
    }
    for (i = 0; i < len; i++)
    {
       if (ascii[arr[i]] == 1)
       {
          printf("%d ", arr[i]);
       }
 }
 
 system("pause");
 return 0;
}

 

wKioL1ZFmo6whrWTAABZmgIYQpY852.png

 

        另外,经过学习,第一种方法很容易想到,第二种方法经典不易想到,现附加方法2.

思路:将数组所有元素均异或,可用来解决“一组数,仅有一个数单独存在,其余数都是成对出现的,找出这个数”这个问题。

        因此,将数组所有元素均异或得tmp,找出tmp从左往右或从右往左(我采用从右往左)起最开始哪一位最先出现二进制1.存下该位pos.然后根据该位是否为1将数组可分为2组。同组内相互异或可分别得到这两个数num1,num2.

全部异或为7(即111) pos = 1

1:0001             pos = 1, A组

1:0001             pos = 1, A组

2:0010             pos != 1,  B组

2:0010             pos != 1,  B组

3:0011             pos = 1, A组

4:0100             pos != 1,  B组

A组元素全部异或得到num1 = 3,

B组元素全部异或得到num2 = 4

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
 
int tmp_bit(int num)
{
     int count = 0;
     while (num)
     {
          //使用计数器找到传过来的tmp从右往左起第一次出现1的位数
          if ((num & 1) == 1)
            return count;
          count++;
          num = num >> 1;
     }
     return -1;//考虑num为负数情况
}
void find_num(int arr[], int len, int *p1, int *p2)
{
     int i = 0;
     int tmp = 0;
     int pos = 0;
     
     //遍历整个数组全部进行异或运算,tmp得到整个数组异或的结果.注意将tmp初始附成0.
     for (i = 0; i < len; i++)  
     {
          tmp ^= arr[i];
     }
     
     pos = tmp_bit(tmp);    //pos接收count的值
     
     //现将数组分组,pos位为1与pos不为1
     for (i = 0; i < len; i++)
     {
          if (1 & (arr[i] >> pos))  
          //pos位为1的每次异或运算,得到一个单独的数
                *p1 ^= arr[i];
          else
                *p2 ^= arr[i];  
          //pos位不为1的每次异或运算,得到另外一个单独的数
     }
     
     
}
int main()
{
     int arr[] = { 1, 3, 1, 3, 5, 7, 9, 5 };
     int len = sizeof(arr) / sizeof(arr[0]);
     int num1 = 0;
     int num2 = 0;
     find_num(arr, len, &num1, &num2);
     printf("%d   %d", num1, num2);
     printf("\n");
     system("pause");
     return 0;
}

wKiom1ZGn9bzeB-KAABebt8iekQ810.png

数组中除了两个数只出现过一次,其他的均出现过两次,请找出这两个只出现过一次的数

如题:数组中除了两个数只出现过一次,其他的均出现过两次,请找出这两个只出现过一次的数 例如:{10,9,8,7,6,6,7,8,9,10,5,5,4,3}; 4和3只出现过一次,请找出出现过一次的数。...
  • cxming007
  • cxming007
  • 2014年04月15日 13:09
  • 7064

数组A中,除了某一个数字x之外,其他数字都出现了三次,而x出现了一次

本文地址:http://blog.csdn.net/morewindows/article/details/12684497转载请标明出处,谢谢。 欢迎关注微博:http://weibo.com...
  • baoendemao
  • baoendemao
  • 2014年10月09日 09:59
  • 2051

经典算法题1:找出数组中只出现一次的数字,其它数字都出现了两次

一个整型数组里除了一个数字之外,其他的数字都出现了两次。请写程序找出这个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。...
  • u011826264
  • u011826264
  • 2014年09月14日 13:19
  • 3923

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

本文给出两种算法,(编译环境Visual Studio 2013)1.遍历整个数组,并记录每个数出现的次数,然后输出只出现一次的数。2.对于出现了奇数次的数,使用疑惑即可。方法一:代码:#includ...
  • no_sying_nothing
  • no_sying_nothing
  • 2016年05月29日 22:49
  • 162

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

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

数组中除了两个数只出现过一次,其他的均出现过两次,请找出这两个只出现过一次的数

如题:数组中除了两个数只出现过一次,其他的均出现过两次,请找出这两个只出现过一次的数 例如:{10,9,8,7,6,6,7,8,9,10,5,5,4,3}; 4和3只出现过一次,请找出出现过一次的...
  • Gong_NIIT
  • Gong_NIIT
  • 2015年04月27日 21:28
  • 212

经典面试题之寻找一组数中只出现一次的两个数

这个面试题是非常经典的,办法有很多,最笨的办法就是一个一个找,但是这样的话计算机太累,时间复杂度,空间复杂度也比较高,所以我这里给出一种简单的方法,这方法主要用到了异或运算,首先介绍一下异或运算: 相...
  • no_sying_nothing
  • no_sying_nothing
  • 2016年07月05日 20:46
  • 265

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

一组数据中只有一个数字出现了一次。 其他所有数字都是成对出现的。请找出这个数字 方法一(不用位运算) 分析:用两个for循环遍历整个数组,从前至后取出数组中的元素,每取出一个数,与后面的...
  • fern_girl
  • fern_girl
  • 2016年11月06日 20:03
  • 137

基于visual Studio2013解决面试题之0608找出两个只出现一次的数

题目解决代码及点评 /*     已知数组中有两个数只出现一次,其他成对出现,请找出这两个数     解决办法:     1)简化问题,如果数组中只有一个数出现一次,那么只要对这个数...
  • yincheng01
  • yincheng01
  • 2013年12月18日 00:41
  • 1280

某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C/C++代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1)------某公司招聘试题

先看看这个题目:某整形数组中除了两个单身整数外, 其余的整数都是成对出现的, 利用C代码求出这两个单身整数。 要求: 时间复杂度o(n), 空间复杂度o(1).        我们先用最傻瓜的方式...
  • stpeace
  • stpeace
  • 2015年06月09日 21:40
  • 1759
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【经典面试题】给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数
举报原因:
原因补充:

(最多只允许输入30个字)