题目:一个Int型数组,存放的数据中有两个重复的次数是奇数次,其他的重复的次数全是偶数次。
要求:找出这两个数据,时间复杂度是O(n) 空间复杂度是O(1)
名词简单解释:
时间复杂度是O(n)案例:遍历一个长度为n的数组,时间复杂度是O(n) 如果在for循环里嵌套一个长度为n的循环那么时间复杂度是O(n2).如果两个for循环有先后顺序,无嵌套关系,时间复杂度还是O(n).
空间复杂度是O(n)案例:创建一个长度为n的数组占用的空间是与n成正比的,空间复杂度是O(n).
解决办法:
(1)假设数据是:55,44,33,44,44,44,22,33,55,55,22,22。
(2)第一步:将数据依次进行异或运算,即:55与44异或运算得到a,a再与33异或运算得到b,一直到最后得到一个数值为x.
步骤详解:
1>“异或”规则:相同为0 不同为1 例如1001异或1010等于0011
2> 进行异或运算以后,所有的出现偶数次的数,变成了0,相当于被剔除,出现奇数次的55中有2个55异或得到0,3个22中有2个异或得到0,最后相当于55和22进行异或运算,得到x(可以肯定的是x不为0)
(3)第二步:假设x的右边的第一位为1(其他位上为1同样可以使用该位),写一个方法假设是public boolean isOne(int value,int num){},用途是判断输入的value在第num位是否为1,返回Boolean结果。将x与原始数据再次进行异或运算。不过要加上isOne方法进行判断,结果是x分别与在第一位上是1的数据异或得到a,第一位上是0的数据异或得到b,a和b就是要求的两个数。
步骤详解:
isOne()方法将数据分为两种即第一位上为0的和第一位上是1的,可以肯定的是要求 的数据a和b一定是不同的两种类型。那么就像是第一步中一样所有的出现偶数次的全部消去,结果是x与22异或得到结果是55,x与55异或得到结果是22。
一些想法:
变形1:一个Int型数组,存放的数据中有两个重复的次数是偶数次,其他的重复的次数全是奇数次。(奇数和偶数变换顺序)
变形2:一个Int型数组,存放的数据中有3个重复的次数是奇数次,其他的重复的次数全是偶数次。(2个变为3个)
变形1:仔细分析的话结果是行不通的,对于第一个的想法可以变成不是异或运算而是同或运算,但是第一步就将要求的两个数a和b剔除了。所以第一步就做不到得到一个上一种的一个肯定不为0的x。就别提第二步了。
变形2:第一步可以实行,得到一个a,b和c 三个数异或。但是不能确定这个结果肯定为0或不为0,事情变得不好处理。可以分类讨论。(此处不做分析)
再看本题该方法的妙处:
依据:
第一步利用数据a和b的相同之处是两者出现的次数是偶数,此条件可以将所有的数据分为两派,此时a和b属于同一方。
第二步利用数据a和b的不同之处是两者至少存在一位不同,此条件可以将所有的数据分为两派,此时a和b属于不同方。
关键方法:巧用异或,解决了关于奇次和偶次的问题。
不论是奇还是偶,还是“两”个数。其实都是表示了0和1世界中的两种可能,代表的是中逻辑,无关数量。知己知彼才能各个突破。
分享到:
相关推荐
它不是那些老套陈旧的动机心理学扯谈。 我并不是说那些传统的应对拖延症的方法理论不对,只是对我无效。当正经历极度消沉的时候,我通常听到的理论的最后一句话是”You just DO IT!”。我有很多的事情要去做。但我...
原型模式i的定义:每个函数都有一个prototype(原型)属性,这个属性是一个对象,它的用途是包含可以由特定类型的所有实例共享的属性和方法。比如在构造函数模型中sayInformation()方法,如果声明两个实例就要构造两次...
tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl
tornado-6.1-cp36-cp36m-manylinux2014_aarch64.whl
基于java的ssm停车位短租系统程序答辩PPT.pptx
tornado-6.4b1-cp38-abi3-musllinux_1_1_x86_64.whl
基于java的招生管理系统答辩PPT.pptx
本压缩包资源说明,你现在往下拉可以看到压缩包内容目录 我是批量上传的基于SpringBoot+Vue的项目,所以描述都一样;有源码有数据库脚本,系统都是测试过可运行的,看文件名即可区分项目~ |Java|SpringBoot|Vue|前后端分离| 开发语言:Java 框架:SpringBoot,Vue JDK版本:JDK1.8 数据库:MySQL 5.7+(推荐5.7,8.0也可以) 数据库工具:Navicat 开发软件: idea/eclipse(推荐idea) Maven包:Maven3.3.9+ 系统环境:Windows/Mac
基于java的农机电招平台答辩PPT.pptx
jdk23 甲骨文官方安装包
基于java的机场网上订票系统答辩PPT.pptx
项目经过测试均可完美运行! 环境说明: 开发语言:java jdk:jdk1.8 数据库:mysql 5.7+ 数据库工具:Navicat11+ 管理工具:maven 开发工具:idea/eclipse
基于java的网上书店销售管理系统答辩PPT.pptx
tornado-6.3.3-cp38-abi3-win32.whl
【作品名称】:基于 Jsp+Sqlserver 实现的超市信息管理系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 系统功能: (1)系统分两种身份:管理员和员工,选择不同的身份进入不同的功能操作界面! (2)商品信息管理:管理员可以添加和维护商品信息,员工只能对商品信息进行查询 (3)员工信息管理:管理员登陆系统后可以可以添加和维护超市员工(收银员)的信息 (4)商品进货管理:管理员登陆系统后可以添加商品进货信息,可以对商品进货信息进行查询和统计,添加商品进进货退货信息,对商品进货退货信息进行查询和统计 (5)商品销售管理:员工(收银员)登陆系统后可以对商品进行销售,可以按时间查询自己的销售业绩;管理员登陆系统后可以按照时间等条件对销售信息进行查询,可以根据小票号登记顾客退货信息,查询顾客退货信息,可以查看员 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl
基于java的热带水果商城答辩PPT.pptx
java awt、Swing实现中国象棋可联机版本采用面向对象思想 采用面向对象的思路,实现中国象棋可联机版本,适合初学者,以及对面向对象有更深层次理解的开发者或者同学。 使用原生的java awt、Swing进行窗口式开发 将素材文件夹放在D:\Game路径下 两个工程直接导入Eclipse,即可运行, ps:一个工程运行两次也可以,需要注意端口号,代码默认如果连接的端口号是3003,则监听3004端口,相反同理。联机前需要确保两台计算机同时处于局域网或外网
web前端设计与开发(详细整理)(包含html讲解,css讲解,移动web讲解),合适学习前端的人员进行基础学习,一秒变高手