剑指Offer - 九度1351 - 数组中只出现一次的数字
- 剑指Offer - 九度1351 - 数组中只出现一次的数字
2013-11-23 01:23
- 题目描述:
- 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 输入:
-
每个测试案例包括两行:第一行包含一个整数n,表示数组大小。2<=n <= 10^6。第二行包含n个整数,表示数组元素,元素均为int。
- 输出:
- 对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。
- 样例输入:
-
- 8
- 2 4 3 6 3 2 5 5
- 8
- 样例输出:
-
- 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 - 数组中只出现一次的数字的更多相关文章
- 剑指Offer - 九度1348 - 数组中的逆序对
剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...
- 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字
剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...
- 【剑指Offer】40、数组中只出现一次的数字
题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1). 解题思路: 这道题目相对比较难 ...
- 剑指offer(40)数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目分析 第一种方法:使用js中的indexOf()和lastIndexOf(),只要两个相等, ...
- 剑指offer四十之数组中只出现一次的数字
一.题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 二.思路 建一个hashMap,统计各数字出现的次数,然后遍历hashMap,输出出现一次的数字 ...
- 剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)
剑指Offer - 九度1373 - 整数中1出现的次数(从1到n整数中1出现的次数)2014-02-05 23:03 题目描述: 亲们!!我们的外国友人YZ这几天总是睡不好,初中奥数里有一个题目一直 ...
- 剑指Offer - 九度1517 - 链表中倒数第k个结点
剑指Offer - 九度1517 - 链表中倒数第k个结点2013-11-30 02:57 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(hint: 请务必使用链表.) 输入: 输入可能包含 ...
- 剑指Offer - 九度1283 - 第一个只出现一次的字符
剑指Offer - 九度1283 - 第一个只出现一次的字符2013-11-21 21:13 题目描述: 在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出 ...
- 剑指offer 面试题56. 数组中只出现一次的两个数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 方法1:用set记录出现过的数字 class Solution { public: void F ...
随机推荐
- TP5.1:模板继承(重要知识点)
1.在app\index\controller文件夹新建一个名为Lyot(自定义)的控制器,在控制器中定义: 2.创建一个被继承的public(自定义)文件夹,里面有三个文件,分别是header.ht ...
- An internal error occurred during: "Generating JAX-WS Web Services".Unable to create JAXBContext
使用myeclipse10 创建webservice时,提示错误: An internal error occurred during: "Generating JAX-WS Web Ser ...
- April 14 2017 Week 15 Friday
Try to be a rainbow in someone's cloud. 当乌云萦绕心头,我愿意成为你的彩虹. Actually there are many rainbows in our l ...
- [译文]PHP千年虫(y2k compliance)
时钟将我们无情地逼近2000年的最后一年,第二年厄运塞耶斯都预言前所未有的电脑故障在每一个可以想象的领域.通常被称为2000年问题,或千年虫,这种 情况很容易解释.程序解释两位在形成XX日期19 XX ...
- Edmonds-Karp算法,最大流POJ(1459)
题目链接:http://poj.org/problem?id=1459 解题报告: 电力调度站不涉及流的产生和消耗,不用考虑,Edmonds-Karp算法,就是利用剩余网络和增广路来解决,网络中的最大 ...
- jQuery实现轮播切换以及将其封装成插件(2)
在上一篇博文中,我们完成了一个简单的轮播切换.它的功能比较简单,仅仅能定时切换图片. 但是有没有这样一种情况.当我们特意的想看某一个轮播显示项时不希望等轮播一圈才能等到,希望通过图上的一些元素,触发某 ...
- 第43章 RTC—实时时钟—零死角玩转STM32-F429系列
第43章 RTC—实时时钟 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fireg ...
- java多线程同步以及线程间通信详解&消费者生产者模式&死锁&Thread.join()(多线程编程之二)
本篇我们将讨论以下知识点: 1.线程同步问题的产生 什么是线程同步问题,我们先来看一段卖票系统的代码,然后再分析这个问题: package com.zejian.test; /** * @author ...
- tree树形
/** * tree * @param menuBeans * @param pid * @return */ public JSON makeTree(List<MenuBean& ...
- 原生Ajax发送请求
ajax get&post 1.使用get发送请求,会有请求缓存 1)什么叫请求缓存,请求信息相同浏览器不会再向服务器发送请求,导致访问服务器失败. 2)解决:将随机数添加到请求路径后面参数 ...