九度OJ 1351:数组中只出现一次的数字 (位运算)

标签: 九度 OJ C语言 位运算
300人阅读 评论(0) 收藏 举报
分类:

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:3098

解决:906

题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
输入:
每个测试案例包括两行:
第一行包含一个整数n,表示数组大小。2<=n <= 10^6。
第二行包含n个整数,表示数组元素,元素均为int。
输出:
对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。
样例输入:
8
2 4 3 6 3 2 5 5
样例输出:
4 6

思路:

这个题的简单版本是数组里除了一个数之外,其他数都出现了两次,求唯一不同的数。

简单版本的做法是:所有数进行异或操作,最终结果就是这个唯一的数。

对于这个题,仍可利用异或运算的性质来做。方法是:

对所有数进行异或,得到的结果就是两个不同数的异或值X。由于这两个数不同,X的二进制中必定有一位是1,假设仅仅这个位上是1的二进制数为M。

再对所有数按照与M为0或1进行分类,分别异或得到的最终值就是所求的两个不同数。


代码:

#include <stdio.h>
 
#define N 1000000
 
int main(void)
{
    int n, i;
    int a[N];
    int m, k1, k2;
 
    while (scanf("%d", &n) != EOF)
    {
        for(i=0; i<n; i++)
            scanf("%d", &a[i]);
 
        k1 = 0;
        for(i=0; i<n; i++)
            k1 ^= a[i];
 
        m = 1;
        while ((k1&m) == 0)
            m <<= 1;
 
        k1 = k2 = 0;
        for(i=0; i<n; i++)
        {
            if (((a[i])&m) == 0)
                k1 ^= a[i];
            else
                k2 ^= a[i];
        }
 
        if (k1 < k2)
            printf("%d %d\n", k1, k2);
        else
            printf("%d %d\n", k2, k1);
    }
 
    return 0;
}
/**************************************************************
    Problem: 1351
    User: liangrx06
    Language: C
    Result: Accepted
    Time:790 ms
    Memory:4748 kb
****************************************************************/



查看评论

位运算之只出现一次的的数字

****************位运算系列之数组中只出现一次的数字****************** //题目(1):在一个数组中只有一个数字出现一次,其他数字都是成对出现的!让你找出这...
  • bitboss
  • bitboss
  • 2016-06-06 11:15:02
  • 944

【位运算】找出数组中,只出现一次的两个数字

题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1). 分析: 由于限制了复杂度,所以要用异或...
  • wbb_1216
  • wbb_1216
  • 2017-03-21 10:29:37
  • 451

找数组中只出现一次的元素--位运算

题1:99个数,里面只有一个数出现了一次,其他均出现了两次;如何最快找到这个数,假设为一个int数组里,数大小没有限制特点:数值范围不确定;仅有一个数单词出现;// 运用位操作,异或所有元素; #in...
  • Tina224243
  • Tina224243
  • 2016-08-02 11:47:18
  • 536

剑指offer:数组中只出现一次的数字(java)

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请些程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1).     如输入数组{2,4,3,6,3,2,5,...
  • abc7845129630
  • abc7845129630
  • 2016-10-06 19:03:31
  • 1366

剑指offer面试题40-数组中只出现一次的数字

题目: 一个整形数组里除了两个数字意外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 要求时间复杂度是On,空间复杂度为O1 这个是上一篇 2016阿里巴巴java笔试题 的...
  • q291611265
  • q291611265
  • 2015-08-31 13:51:26
  • 1432

[Python]数组中只出现一次的数字

题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 解法1: 通过遍历把统计的数字次数存入python内置的字典dict,然后再搜寻出现一次...
  • jiayk2016
  • jiayk2016
  • 2018-03-16 11:11:17
  • 118

数组中只出现一次的数字 C++

【题目】 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 【题目分析】 注意异或运算的特点:即两个相同的数异或结果为0。也就是说,当一个整型数组...
  • noc_lemontree
  • noc_lemontree
  • 2016-07-29 16:42:03
  • 323

经典算法——数组中只出现一次的数字

题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 class Solution { public: void Fi...
  • geekmanong
  • geekmanong
  • 2016-03-19 17:22:00
  • 1599

剑指Offer面试题40(Java版):数组出现一次的数字

题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。  * 请些程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1) 例如输入数组{2,4,3,6,3,2,5,...
  • jsqfengbao
  • jsqfengbao
  • 2015-08-10 19:04:19
  • 1852

九度OJ 1351 数组中只出现一次的数字

题目地址:http://ac.jobdu.com/problem.php?pid=1351 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字...
  • JDPlus
  • JDPlus
  • 2014-02-17 08:09:51
  • 1299
    个人资料
    专栏达人
    等级:
    访问量: 17万+
    积分: 5091
    排名: 6836
    博客专栏