Day40:数组中只出现一次的数字
剑指Offer_编程题——数组中只出现一次的数字
题目描述:
一个整型数组里除了两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体实现:
思路一: 如果把数组中的所有数字都依次异或一遍,则可以消掉成对出现的数字,那么还有两个数字是单一的,肯定也不同,那么最终异或的结果肯定不是0。表示在二进制中肯定有一位是1,那么两个不同的数字,一定有一个在该位为1,另一个在该位为0。如果将整个数组按照该位是否为1分为两部分,那么这两部分各自包含一个单一数字。这里实现这个就需要设置一个flag标志位,通过对其**左移动来实现。flag<<= 1;或者是flag=flag*2;分为两部分的数组,分别异或,最终结果就是这两个数。这里需要注意的是这个flag就是我们一个额外的条件,按照条件查找,边查找,边异或就行了。**具=具体用Java实现如下:
public class Solution{
public void FindNumsAppearOnce(int []array, int num1[], int[] num2){
int flag = 1;
int temp = array[0];
for(int i = 1; i < array.length; i++)
temp = array[i]^temp;
while((flag&temp) == 0)
flag = flag * 2;
for(int i = 0; i < array.length; ++i){
if((flag & array[i]) == 0)
num2[0] ^= array[i];
else
continue;
}
num1[0] = temp^num2[0];
}
}
代码效果图如图所示:
思路二: 可以采用哈希表的思想来完成该题:具体来说:直接将里面的每个数字映射到字典里,然后作为索引,出现次数作为值,最后取出值为一的索引值。具体我们用python将其实现:
class Solution:
def FindNumsAppearOnce(self, array):
count = {}
for i in array:
if i not in count:
count[i] = 1
else:
count[i] += 1
ls = []
for i in array:
if count[i] == 1:
ls.append(i)
return ls
代码效果图如图所示:
思路三: 通过遍历把统计的数字次数存入python内置的字典dict,然后再搜寻出现一次的数字,具体用Python实现如下:
class Solution:
def FindNumsAppearOnce(self, array):
tagdict = {}
for i in array:
if i in tagdict:
tagdict[i] += 1
else:
tagdict[i] = 1
taglist = []
for j in tagdict:
if tagdict[j] == 1:
taglist.append(j)
return taglist
代码效果图如图所示:
思路四: 通过使用python的count计数函数,具体用python实现如下:
class Solution:
def FindNumsAppearOnce(self, array):
taglist = []
for i in array:
if array.count(i) == 1 and i not in taglist:
taglist.append(i)
return taglist
代码效果图如图所示:
总结
本道题通过数组来考察我们对综合知识的应用,在本题中我么用了四中方法来解决此问题。刚开始想到的问题就是对数组进行排序,然后将计数为1的将其输出,但是过于复杂,就没有实现。我们首先用到了异或和左移运算来解决此题,其实所示通过哈希表来解出该题,接着是用到了python中的字典,然后将为1的进行输出,最后就是用到了python中的count函数。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!
参考文献
[1] 山鬼谣弋痕夕 [2] 杨二K [3] jiayk2016
- go 并发处理脚本
- 生信菜鸟团博客2周年精选文章集(4)NCBI数据库的几个探索
- PHP 的前世今生
- 【直播】我的基因组49:Y染色体的SNV不能用常规流程来找?
- 【直播】我的基因组46:SNV突变(96种)频谱的制作
- 深入剖析-Oracle索引分支块的结构
- 【直播】我的基因组48:我可能测了一个假的全基因组
- 【直播】我的基因组47:测序深度和GC含量的关系
- 【直播】我的基因组47:测序深度和GC含量的关系
- SNV突变(96种)频谱的制作
- Golang语言社区--go语言执行cmd命令关机、重启等
- 【直播】我的基因组 45:SNV突变(6种)频谱的制作
- 【直播】我的基因组 44:比对文件画profile和heatmap图
- 做过1000遍RNA-seq的老司机告诉你如何翻车
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 性能测试必备知识(6)- 如何查看“CPU 上下文切换”
- flex布局 div盒子居中
- 使用Apple Configurator 2提取商店ipa or app文件
- Spring 自动装配模式之byType
- 使用ATOMac进行Mac自动化测试
- 【赵渝强老师】什么是Oracle的数据字典?
- antd 如何在 src目录下 引入 Public 目录下的文件
- (精编)Python与安全(三)SSTI服务器模板注入
- 一年经验Java开发0713面试
- 【分享】MicroBlaze大内部存储器(AXI BRAM)设计
- Spring Beans 自动装配
- Python将txt文件内容转换成列表
- 刷题记录-猿辅导2020
- redis stream(一):stream命令入门
- os.path.basename()