任何一个数字异或他自己都等于0,0异或任何一个数都等于那个数。数组中出了两个数字之外,其他数字都出现两次,那么我们从头到尾依次异或数组中的每个数,那么出现两次的数字都在整个过程中被抵消掉,那两个不同的数字异或的值不为0,也就是说这两个数的异或值中至少某一位为1。我们找到结果数字中最右边为1的那一位i,然后一次遍历数组中的数字,如果数字的第i位为1,则数字分到第一组,数字的第i位不为1,则数字分到第二组。这样任何两个相同的数字就分到了一组,而两个不同的数字在第i位必然一个为1一个不为1而分到不同的组,然后再对两个组依次进行异或操作,最后每一组得到的结果对应的就是两个只出现一次的数字。'''

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

'''

# -*- coding:utf-8 -*-

class Solution:

# 返回[a,b] 其中ab是出现一次的两个数字

def FindNumsAppearOnce(self, array):

if array == None or len(array) <= 0:

return []

resultExclusiveOr = 0

for i in array:

resultExclusiveOr ^= i

indexOf1 = self.FindFirstBitIs1(resultExclusiveOr)

num1, num2 = 0

for j in range(len(array)):

if self.IsBit1(array[j], indexOf1):

num1 ^= array[j]

else:

num2 ^= array[j]

return [num1, num2]

def FindFirstBitIs1(self, num):

indexBit = 0

while num & 1 == 0 and indexBit <= 32:

indexBit += 1

num = num >> 1

return indexBit

def IsBit1(self, num, indexBit):

num = num >> indexBit

return num & 1

class Solution2:

# 返回[a,b] 其中ab是出现一次的两个数字

def FindNumsAppearOnce(self, array):

if array == None or len(array) <= 0:

return []

resultExOr = self.ExOr(array)

i = 0

while resultExOr and i <= 32:

i += 1

resultExOr = resultExOr>>1

num1, num2 = [], []

for num in array:

if self.bitIs1(num, i):

num1.append(num)

else:

num2.append(num)

first = self.ExOr(num1)

second = self.ExOr(num2)

return [first, second]

def ExOr(self, aList):

ExOrNum = 0

for i in aList:

ExOrNum = ExOrNum ^ i

return ExOrNum

def bitIs1(self, n, i):

n = n >> (i-1)

return n & 1

aList = [2, 4, 3, 6, 3, 2, 5, 5]

s = Solution()

print(s.FindNumsAppearOnce(aList))

python找出只出现一次的数字_Python数组中只出现一次的数字相关推荐

  1. 从键盘输入10个互不相同的整数,找出其中最小的元素将其与数组中的第一个元素进行交换。

    题目: /* 从键盘输入10个互不相同的整数,找出其中最小的元素将其与数组中的第一个元素进行交换. */ 代码: c++做的. #include<iostream> using names ...

  2. 《剑指offer》-- 第一个只出现一次的字符、数组中只出现一次的数字、字符流中第一个不重复的字符、数组中重复的数字

    一.第一个只出现一次的字符: 1.题目: 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写 ...

  3. php旋转数组找出最小的,LeetCode 153 寻找旋转排序数组中的最小值

    链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ...

  4. 笔试算法题(28):删除乱序链表中的重复项 找出已经排好序的两个数组中的相同项...

    出题:给定一个乱序链表,节点值为ASCII字符,但是其中有重复项,要求去除重复项并保证不改变剩余项的原有顺序: 分析:创建一个256(2^8)大小的bool数组,初始化为false,顺序读取链表,将字 ...

  5. 在哪里能收到python实例代码-Python找出最小的K个数实例代码

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 这个题目完成的思路有很多,很多排序算法都可以完成既定操作,关键是复 ...

  6. Python找出列表中出现次数最多的元素三种方式

    通过三种方式给大家介绍,具体详情如下所示: 方式一: 原理:创建一个新的空字典,用循环的方式来获取列表中的每一个元素,判断获取的元素是否存在字典中的key,如果不存在的话,将元素作为key,值为列表中 ...

  7. linux 端口tnpl,利用Python找出9个连续的空闲端口

    这篇文章主要介绍了Python找出9个连续的空闲端口的方法,感兴趣的小伙伴们可以参考一下 一.项目需求 安装某软件,配置时候需要填写空闲的端口.查看5个平台的某个端口是否被占用 5个平台为window ...

  8. 如何用 Python 找出某月的第一天

    博客翻译自:https://www.mytecbits.com/internet/python/first-day-of-the-month Python 没有直接地方法获取某月的第一天,但只需要一些 ...

  9. python找出某个文件夹下某个后缀的文件

    python找出某个文件夹下某个后缀的文件 import osdef find_files_with_suffix(folder_path, suffix):# 使用os模块获取文件夹中所有文件的路径 ...

最新文章

  1. 国内外交互体验很好的十款验证码
  2. Gardener and Tree 图论,树,队列
  3. java引用其他类的数据头文件_Java 实现数据表与简单Java类映射转换
  4. 计算机组成与系统结构+答案书,计算机组成与系统结构书本答案
  5. 一个列表中按钮的不同样式
  6. 【CodeForces - 474D】Flowers (线性dp)
  7. 背包问题学习笔记(二)
  8. CXF WebService 开发文档-目录索引
  9. LeetCode234题:回文链表
  10. 断点运行的参数_利用 AicLaunchAdminProcess 参数污染 bypass UAC
  11. linux服务器知识学习:linux系统的目录结构
  12. 学生a3制图标题栏尺寸手绘_机械制图基础知识学习,如何画好一张零件图?
  13. Java之打印指定月份日历
  14. sql查询表名、列名、列属性
  15. mastercam西门子840d后处理_西门子802D数控铣后处理程序
  16. 把Python代码封装成exe(windows的可执行程序)
  17. 时钟显示(C语言实现)
  18. Android——超简单悬浮窗使用教程
  19. Unity项目总结(已完成17项,持续更新ing,含商城、塔防、背包、动画、坦克大战等)
  20. 指针数组和指向指针的指针

热门文章

  1. 几种常用的优化方法梯度下降法、牛顿法、)
  2. 工业级路由器和家用路由器的区别_工业路由器和普通家用路由器有什么区别啊?工业路由器好不好用啊?...
  3. ES6——举个例子理解Promise的原理和使用
  4. lnmp搭建的常见错误
  5. org.tinygroup.databasebuinstaller-数据库结构及元数据自动创建
  6. Linux 下安装python软件包(pip、nose、virtualenv、distribute )
  7. Python学习预备
  8. 开发---推荐16个国外的源码下载网站
  9. ASPxGridView1单击,双击事件
  10. asp.net 分页控件