如果你还没有看过上一篇文章,请先移步看问题描述。

扩展问题二:至多扫描一遍序列,求出丢失的两个数字。  

不管用什么方法,可以肯定的是我们至少需要扫描一遍序列。

因为只能扫描一遍,所以先求出 a XOR b,再根据结果分类的方法就不适用了。

既然我们不能根据某一位分类,那我们能否对所有位进行分类呢?比如,int是32位,我们可以对每一位都分成两类分别异或。

我们还要记录每一位上1出现的次数,实际上,只需要记录1出现奇数次还是偶数次就够了。

如果某一位上1出现奇数次,那么我们就知道 a 和 b 在此位上的比特不同。从而利用前面分类异或的结果就直接得出答案。

Python 代码:

def find_missing_2_numbers_v2(sequence, n):
    """ returns the missing two numbers of sequence, which is supposed
    to be a permutation of {1,..,n} with two numbers missing.
    An one-pass algorithm.
    """
    xors = [[0 for i in xrange(2)] for j in xrange(32)]
    counts = [0 for i in xrange(32)]
    for i in xrange(1, n + 1):
        for k in xrange(32):
            t = 1 & (i >> k)
            xors[k][t] ^= i
            counts[k] ^= t
    for e in sequence:
        for k in xrange(32):
            t = 1 & (e >> k)
            xors[k][t] ^= e
            counts[k] ^= t
    a, b = 0, 0
    for k in xrange(32):
        if counts[k]:
            a, b = xors[k][0], xors[k][1]
            break

return a, b

扩展问题三:如果有三个数字丢失了呢?

其实上面的方法稍加修改就可以解决此问,具体实现留给读者。有道类似题目http://yzfy.org/dis/listpost.php?tid=1009 可以用来测试你的算法~

转载于:https://www.cnblogs.com/shilcare/archive/2012/04/24/2468336.html

寻找丢失的数字(二)相关推荐

  1. JSK-115 单独的数字(二)【位运算】

    单独的数字(二) 一个整型数组中有一个元素只出现一次,其它元素都出现两次.求出只出现一次的元素. 要求: 线性时间复杂度,不能使用额外空间. 聪明的你能搞定吗? 格式: 第一行输入数字n,代表有n个数 ...

  2. 查找数组中重复数字 (二)

    #include <iostream> #include <string.h> using namespace std;void FindRepeatNum(int *arr, ...

  3. 一连串数字怎么转换成二维码?数字生成二维码如何制作?

    当我们使用二维码内容做成数字时该如何制作呢,比如做成标签码,序号码,号码牌等等,都可以使用数字二维码来展示,那么如何操作才能将一连串数字做成二维码呢?下面给大家分享一下数字静态二维码和数字微信活码的制 ...

  4. MNIST手写数字识别 —— 图像分析法实现二分类

    手写数字任务识别简介 MNIST 数据集来自美国国家标准与技术研究所(National Institute of Standards and Technology,简称 NIST ),总共有7万张图, ...

  5. python全栈学习总结二:数字、字符串、列表、元组、字典重要特点及方法

    一 python中数据类型 整形:int 字符串:str 列表:list 元组:tuple 字典:dict 布尔值:bool 浮点型:float 一切皆对象,在python中,所有的数据类都是看做对象 ...

  6. OpenCV萌新福音:易上手的数字识别实践案例

    摘要:信用卡识别的案例用到了图像处理的一些基本操作,对刚上手CV的人来说还是比较友好的. 本文分享自华为云社区<Python openCV案例:信用卡数字识别>,原文作者:深蓝的回音 . ...

  7. Java 数字转汉字工具类

    Java 数字转汉字工具类 一.工具类--NumberToCnUtil package com.example.demotest.util;import java.util.Arrays; impor ...

  8. python项目二:多种验证码及二维码输出

    python项目二:多种验证码及二维码输出 ` import os import qrcode import random import time import tkinter from pystri ...

  9. 网址二维码:如何制作网页链接二维码?

    1994年,一家日本的公司发明了二维码,最开始是用来追踪旗下公司零部件的维修情况.在二维码上有不同的区域,标识不同的信息,比如对齐模式.定时模式.安静区域.版本信息.数据单元等. 现如今二维码和我们的 ...

最新文章

  1. 无线网中的一些技术名词和解释
  2. 赠书 | Python人脸五官姿态检测
  3. inner class java_Java Inner Class
  4. 更智能:人工智能与能源行业的革命
  5. 构建之法——软件工程概论、团队组织管理及开发流程
  6. VR中的白帽机制,这把安全的双刃剑应该如何使用?
  7. 开发日记-20190417 关键词 代码之间耦合度的一刀两断 (思路篇)
  8. Hbase写入量大导致region过大无法split问题
  9. python中的类及self详解_Python类class参数self原理解析
  10. 图解TCP数据报结构以及三次握手(非常详细)
  11. matlab编译器和程序发布
  12. oracle 小计 排序,使用SQL实现小计,合计以及排序
  13. Java开发和嵌入式开发该如何选择
  14. 分布式下的session问题
  15. 前端面试面向对象_面向初级前端开发人员的面试问题
  16. 喜大普奔!Django官方文档终于出中文版了
  17. Shiny 版混合线性模型的建模遍历
  18. linux网络使用情况分析工具
  19. 软件工程专业毕业计算机水平,软件工程专业很“霸气”,不管985还是“二本”,毕业几乎都高薪就业...
  20. 魔方世界服务器文件,魔方世界服务器指令 | 手游网游页游攻略大全

热门文章

  1. ios加载本地游戏html,使用WKWebView iOS加载本地HTML / Javascript
  2. libevent源码学习-----事件驱动流程分析
  3. 防火墙(7)——禁止具体协议
  4. iOS 真机调试包集合 包含 iOS 12.4 不断更新
  5. 汇编---输出AX的地址值
  6. ubuntu下txt文件编码转换、查询(gbk/ISO-8859-utf-8)
  7. HDU Problem - 4289 Control(最大流)
  8. CodeForces - 803C Maximal GCD(贪心 + 枚举)
  9. tail | grep引起的内存升高【对比三天数据】
  10. warning: ISO C++ forbids converting a string constant to ‘char*‘ [-Wwrite-strings]