算法面试题(python)——如何找出数组中出现一次的数
题目描述:
一个数组里,除了三个数是唯一出现的,其余的数都出现了偶数次,找出这三个数中任意一个。比如数组序列为[1,2,4,5,6,4,2],只有1、5、6这三个数字是唯一出现的,数字2、4均出现了偶数次,只需要输出数字1、5、6中的任意一个就行。
分析:
题目得出的信息:
(1)数组中的元素一定为奇数个;
(2)由于只有三个数字均出现过一次,显然这三个数字不相同,因此,这三个数字对应的二进制也不可能完全相同。
解题思路:
因此可知:必定能找到二进制数中的某一个bit来区分这三个数(这一个bit的取值或者为0,或者为1),当通过这一个bit的值对数组进行分组的时候,这三个数一定是可以被分到两个子数组中去,。此时我们只需要重点关注哪个子数组中分配了这三个数的其中一个,就可以很容易得到这个数字了。当数组被划分成两个子数组时,这一个bit的值为1的数被分到一个子数组subArray1中,这一个bit的值为0的数被分到了另外一个子数组subArray0.
(1)如果subArray1中元素个数为奇数个,那么对subArray1中的所有数字进行异或操作;由于a^a=0,a^0=a,出现两次的数字通过异或操作得到结果为0,然后再与只出现一次的数字执行异或操作,得到的结果只出现一次的数字。
(2)如果subArray0中元素个数为奇数个,那么对subArray0中的所有数字进行异或操作得到的结果就是其中一个只出现一次的数字。
区分三个数字bit位及算法的实现思路:
32位平台为例,一个int类型的数字占用32位空间,从右往左使用每一位对数组进行分组,分组过程中,计算这个bit值为0的数字的异或的结果result0,出现次数count0;这个bit值为1的所有数字异或结果result1,出现次数为count1;
如果count0是奇数且result1 != 0 ,那么说明这三个数的其中一个数被分配到了这一个bit为0的子数组,因此,这个子数组中所有数字异或的值result0一定为出现的数字。(如果result1=0说明这一个bit不能用来区分这三个数字,此时这三个数字都被划分到子数组subArray0中,因此,result1!=0就可以确定这一个bit可以被用来划分这三个数字)
同理,如果count1是奇数且result0!=0,那么result1就是其中一个出现1次的数。
以[6,3,4,5,9,4,3]为例,出现1次的数字为6(110)、5(101)、9(1001),从右往左第一位就可以区分这三个数字,用这个bit位可以把数字区分为两个子数组subArray0=(6,4,4)和subArray1=(3,5,9,3)。subArray1中所有元素异或的值不等于0,说明出现一次的数字一定在subArray1中出现了,而subArray0中的元素个数为奇数个,说明出现一次的数字其中只有一个被分配到subArray0中了,所以subArray0中所有的元素异或的结果就是这个出现1次的数字6,实现算法的python代码如下:
#判断数字n的二进制数从右往左的第i位是否为1
def isOne(n,i):return (n&(1<<i)) == 1def findSingle(arr):size = len(arr)for i in range(32):result0 = result1 = count0 = count1 = 0for j in range(size):if isOne(arr[j],i):result1 ^= arr[i]count1 += 1else:result0 ^= arr[j]count0 += 1"""bit值为1的子数组元素个数为奇数时,且出现1次的的数字被分配到bit值为0的子数组,说明只有一个出现的数字被分配到bit的值为1的子数组中,异或记过就是这个出现一次的数字 """if count1 % 2 == 1 and result0 != 0:return result1#只有一个出现一次的数字被分配到bit值为0的子数组中if count0 % 2 == 1 and result1 != 0:return result0return -1
转载于:https://www.cnblogs.com/circleyuan/p/10350170.html
算法面试题(python)——如何找出数组中出现一次的数相关推荐
- Python数据分析 找出数组中每行(或每列)中指定的百分位数 numpy.percentile()
[小白从小学Python.C.Java] [Python-计算机等级考试二级] [Python-数据分析] Python数据分析 找出数组中每行(或每列) 中指定的百分位数 numpy.percent ...
- 找出数组中出现次数超过一半的数
算法--找出数组中出现次数超过一半的数 每当我看到经典的算法题,就怀念高中,感觉很多算法题就是高中的题目,谁叫哥只读了个专科,高数基本相当没学. 有空要看看高数啊,想当年数学那是相 ...
- 找出数组中第k大小的数,输出数所在的位置
找出数组中第k大小的数,输出数所在的位置 /*写一段程序,找出数组中第k大小的数,输出数所在的位置.例如{2,4,3,4,7}中,第一大的数是7,位置在4. 第二大.第三大的数都是4,位置在1.3随便 ...
- 找出数组中第k大的数
给定一个数组,找出数组中第k大的数.其实现代码如下: package com.threeTop.www;/*** 找出数组中第k大的数* @author wjgs**/ public class Fi ...
- Java找出数组中第K大的数
题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数. 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在. 测试样例: [1,3,5 ...
- 用Python找出数组中出现次数超过一半的数
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 计数+比较 不考虑效率,采用最简单的办法,遍历数组,使用 List 的 count() 方法统计元素出现的次数: def more_th ...
- 剑指offer python版 找出数组中重复的数字
def aa(nums):if not nums:return Falsehashes={}ret=[]for s in nums:hashes[s]=hashes[s]+1 if hashes.ge ...
- 《编程题》找出数组中出现次数超过一半的数(时间复杂度O(n),空间复杂度为O(1))
解析:该题目可以用mapreduce的wordcount思想做,就是存储键.值对,键存数字,值存该数字出现的次数,当然需要用一个变量记住出现次数超过一半的数了,说完了,开始撸起袖子干了. public ...
- 剑指offer 面试题三 找出数组中重复的数字
1 import org.junit.Test; 2 3 import java.util.Arrays; 4 import java.util.HashSet; 5 6 public class D ...
- 图解面试题:找出数组中重复的数字?
今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题03. 数组中重复的数字. 题目链接:https://leetcode-cn.com/problems/shu-zu-zhon ...
最新文章
- 百度不再效仿谷歌,否认分拆阿波罗
- 给力开源,.Net开源地址大收集
- 粒子群算法参数w的改进
- 【转】Spark源码分析之-scheduler模块
- html5 ios cookie,iOS设置cookie到web遇到的坑
- WF4.0实战(九):猜数字游戏,测下你的智力
- 微信开发学习日记(八):7步看懂weiphp插件机制,核心目标是响应微信请求
- ZOJ 3229 有上下界最大流
- 概率论基础3----分布
- NXP单片机开发环境搭建,开发包下载
- 用c#语言制作点歌程序,c#实现KTV点歌系统
- 港科百创 | 一清创新完成Pre-A+轮战略融资
- 张云茹计算机,张云茹 - 重庆理工大学 - 药学与生物工程学院
- MySQL顺序读写和随机读写磁盘_随机读写与顺序读写的深入理解
- JDBC基础理解与实现操作
- 南陵中学2021高考成绩查询,南陵中学举行2021届高三距高考200天动员大会
- 高通 安卓 Uefi 的理解
- 微信APP支付申请方法
- 学习Python要学习哪些课程?
- vue2使用wangEditor