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

原创 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只出现过一次,请找出出现过一次的数。...

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

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

一个整型数组里除了两个数之外,其他数都出现了两次。找出这两个出现一次的数。

第一个想法是借助辅助数组以及折半插入来实现 第二个想法是通过 异或运算 实现

@陈利人 : #面试题#给定两个数组X和Y,元素都是正数。请找出满足如下条件的数对的数目: x^y > y^x,即x的y次方>y的x次方;x来自X数组,y来自Y数组

数对数目分析 原题 给定两个数组X和Y,元素都是正数。请找出满足如下条件的数对的数目: x^y > y^x,即x的y次方>y的x次方 x来自X数组,y来自Y数组 分析 假设数组X的...

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

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

程序员面试题精选100题(34)-找出数组中两个只出现一次的数字

http://zhedahht.blog.163.com/blog/static/2541117420071128950682/ 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次...

一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数

一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数,要求算法的时间复杂度为O(n). n为数组的长度。   程序代码如下: //取二进制中首个为1的位置 int...

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n) ,空间复杂度是O(1) 。分析:这是一道很新颖的关于位运算的面试题。首先我们...
  • erazy0
  • erazy0
  • 2011-05-24 17:56
  • 1726

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

面试题40:数组中只出现一次的数字 提交网址:  http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&t...

数组------找出数组中只出现一次的两个数

题目描述: 给定一个数组arr,其中除了特定的两个数以外,其他数都出现两次,现写程序找出这两个只出现一次的数。 分析: 根据题目的特殊性,需要使用到异或。因为相同两个数的异或结果...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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