数组中只出现一次的数字
来源:互联网 发布:看不见的客人影评知乎 编辑:程序博客网 时间:2024/06/11 21:19
1.题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
传送门
2.code(java1.7版本)
大多数人想到的常规的版本
//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import java.util.*;public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { if(array==null)return; int len=array.length; HashMap<Integer,Integer> map=new HashMap<Integer,Integer>(); for(int i=0;i<len;i++){ if(map.containsKey(array[i])){ map.remove(array[i]); } else{ map.put(array[i],1); } } boolean flag1=false; boolean flag2=false; Iterator iter = map.entrySet().iterator(); while(iter.hasNext()){ Map.Entry entry = (Map.Entry)iter.next(); Object key = entry.getKey(); Object val = entry.getValue(); if(!flag1){ num1[0]=(int)key; flag1=true; continue; } if(!flag2){ num2[0]=(int)key; flag2=true; continue; } } }}
运用异或办法实现的神奇版本
//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import java.util.*;public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { if(array==null)return; int len=array.length; if(len==1)return; int ans=0; int flag=1; for(int i=0;i<len;i++){ ans^=array[i]; } while((ans&flag)==0)flag<<=1; num1[0]=ans; num2[0]=ans; for(int i=0;i<len;i++){ if((flag&array[i])==0)num1[0]^=array[i]; else num2[0]^=array[i]; } }}
3.解题思路
对于非常常规的版本,就不多说了,主要就是遍历统计每个数出现的次数,再将只出现一次的数进行赋值返回即可。
对于运用异或的版本,主要的思想就是二进制数之间进行异或,相同的异或为0,不相同的异或为1。这样可以过滤掉出现两次的数,剩下只出现一次的数,这样即可完成查找。
阅读全文
1 0
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- spark学习-26-Spark性能调优(1)
- DML、DDL、DCL
- Android多渠道打包汇总(五)—— 友盟的多渠道打包方式
- Idea使用中遇到的报错
- 精通 Groovy
- 数组中只出现一次的数字
- cnpm全局安装
- 进程调度算法
- Android多渠道打包汇总(六)—— 美团的多渠道打包方式
- Analysis Gym
- Python脚本实现树莓派读取mpu9250传感器数据
- 设计模式准备篇
- 工作后,你悟出什么职场道理?
- 24.Redis集群安装使用