剑指Offer - 九度1351 - 数组中只出现一次的数字
2013-11-23 01:23
题目描述:
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
输入:
每个测试案例包括两行:
第一行包含一个整数n,表示数组大小。2<=n <= 10^6。
第二行包含n个整数,表示数组元素,元素均为int。
输出:
对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。
样例输入:
8
2 4 3 6 3 2 5 5
样例输出:
4 6
题意分析:
  题目要求找出两个只出现一次的数,其他数都出现了两次。如果是一个数只出现一次的话,那全部xor之后就是结果了。
  对于两个数,情况还是比较特殊的。因为两个数a和b,c = a ^ b;则c表示的就是a和b不同的位,树状数组的lowbit操作比较方便,取bit = c & (-c)。从其中随便取一位就可以将数组分为两拨儿,一拨儿这位是0,另一拨儿是1。对于那些成双的数字,总会落在同一堆里,依然是做xor,成对的数字消除掉,剩下的两个结果就是那两个数了。
  扫描一遍,时间复杂度O(n),空间复杂度O(n)。
  不过,要是有三个数只出现一次呢?要是其他数都出现三次呢?
  当然,通用的笨办法肯定有:扫一遍统计每个元素出现的次数,用map来存统计结果。时间复杂度O(nlog n),空间复杂度O(n)。
 // 652741    zhuli19901106    1351    Accepted    点击此处查看所有case的执行结果    4540KB    799B    790MS
//
#include <cstdio>
using namespace std; int main()
{
int *a = NULL;
int n, i;
int r1, r2;
int r;
int bit; while(scanf("%d", &n) == ){
if(n <= ){
continue;
} a = new int[n]; for(i = ; i < n; ++i){
scanf("%d", &a[i]);
}
r = ;
for(i = ; i < n; ++i){
r ^= a[i];
}
// not necessarily the lowbit, any bit with value '1' can be the pivot bit.
bit = r & (-r); r1 = r2 = ;
for(i = ; i < n; ++i){
if((a[i] & bit) != ){
r1 ^= a[i];
}else{
r2 ^= a[i];
}
} if(r1 > r2){
r1 ^= r2 ^= r1 ^= r2;
} printf("%d %d\n", r1, r2); delete[] a;
a = NULL;
} return ;
}

剑指Offer - 九度1351 - 数组中只出现一次的数字的更多相关文章

  1. 剑指Offer - 九度1348 - 数组中的逆序对

    剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...

  2. 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字

    剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...

  3. 【剑指Offer】40、数组中只出现一次的数字

      题目描述:   一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1).   解题思路:   这道题目相对比较难 ...

  4. 剑指offer(40)数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目分析 第一种方法:使用js中的indexOf()和lastIndexOf(),只要两个相等, ...

  5. 剑指offer四十之数组中只出现一次的数字

    一.题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 二.思路 建一个hashMap,统计各数字出现的次数,然后遍历hashMap,输出出现一次的数字 ...

  6. 剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)

    剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)2014-02-05 23:03 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直 ...

  7. 剑指Offer - 九度1517 - 链表中倒数第k个结点

    剑指Offer - 九度1517 - 链表中倒数第k个结点2013-11-30 02:57 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含 ...

  8. 剑指Offer - 九度1283 - 第一个只出现一次的字符

    剑指Offer - 九度1283 - 第一个只出现一次的字符2013-11-21 21:13 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出 ...

  9. 剑指offer 面试题56. 数组中只出现一次的两个数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 方法1:用set记录出现过的数字 class Solution { public: void F ...

随机推荐

  1. API:Sign签名的执行流程

    Sign签名存在目的:为了防止不法分子修改参数数据,进而攻击服务器,导致数据泄露或从中获得利益    例如:一个接口是用户把积分转帐给他的朋友,修改后,变为转帐到攻击者的帐户,这样,攻击者就能得到利益 ...

  2. Linux修改文件permission可执行属性

    列出文件属性 ls -al 修改文件属性为可读.可写 sudo chmod -c 777 <your file name>

  3. 在微信小程序里自动获得当前手机所在的经纬度并转换成地址

    效果:我在手机上打开微信小程序,自动显示出我当前所在的地理位置: 具体步骤: 1. 使用微信jssdk提供的getLocation API拿到经纬度: 2. 调用高德地图的api使用经纬度去换取地址的 ...

  4. InnoDB多版本(MVCC)实现简要分析

    转载自:http://hedengcheng.com/?p=148 基本知识 假设对于多版本(MVCC)的基础知识,有所了解.InnoDB为了实现多版本的一致读,采用的是基于回滚段的协议. 行结构 I ...

  5. 深入浅出Nginx

    深入浅出Nginx   文章源自zfz_linux_boy   前言 Nginx是一款轻量级的Web服务器.反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用. 上图基 ...

  6. IIS7.5如何限制某UserAgent 禁止访问

    参见Blocking Bots Based on User-Agenthttp://moz.com/ugc/blocking-bots-based-on-useragent http://server ...

  7. JS显示上一周

    <html> <head> <script> var currDT; var aryDay = new Array("日","一&qu ...

  8. CentOS系统中使用iptables设置端口转发

    echo 1 > /proc/sys/net/ipv4/ip_forward 首先应该做的是/etc/sysctl.conf配置文件的 net.ipv4.ip_forward = 1 默认是0  ...

  9. PMVS论文随笔(1)

    博客园排版系统真的比较挫,可以访问我的github.io阅读 关于Unit的概念 在pmvs的源代码中,有一个函数是getUnit ,其函数如下(在PMVS2的windows版本代码,optim.cc ...

  10. JS isArray、typeof、instanceof

    Array.isArray() 用来检验是不是数组 var a = [1,2,3] console.log(typeof a); // object console.log(Array.isArray ...