数组中只出现一次的数字(java版)
来源:互联网 发布:java urlencode转码 编辑:程序博客网 时间:2024/06/05 23:30
【题目描述】一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
【解题思路1】暴力解法
//1. 对数组进行排序。
//2. 遍历一次数组,将array[i]分别与array[i-1]和array[i+1]作比较,若都不相同,则找到只出现一次的值。
//3. 注意处理第一个数字和最后一个数字的边界情况。
//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import java.util.ArrayList;import java.util.Arrays;public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { ArrayList<Integer> arr = new ArrayList<Integer>(); Arrays.sort(array); for(int i=0, len=array.length; i<len; i++){ if(i==len-1 && array[i]!=array[i-1]){ arr.add(array[i]); }else if(i==0 && array[i]!=array[i+1]){ arr.add(array[i]); }else{ if(i!=0 && i!=len-1 && array[i]!=array[i-1] && array[i]!=array[i+1]){ arr.add(array[i]); } } } num1[0] = arr.get(0); num2[0] = arr.get(1); }}
【解题思路2】暴力解法
//1. 遍历数组,使用一个ArrayList记录当前只出现了一次的值。
//2. 若当前遍历的值,在ArrayList中已经出现,则移除该值,继续遍历。
//3. 最后剩下的两个值,即为所求。
【源码2】
import java.util.ArrayList;public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { ArrayList<Integer>list=new ArrayList<Integer>(); for(int i=0;i<array.length;i++) { if(!list.contains(array[i])) list.add(array[i]); else list.remove(new Integer(array[i])); } if(list.size()>1) { num1[0]=list.get(0); num2[0]=list.get(1); } }}
【解题思路3】位运算
//1. 除了有两个数字只出现了一次,其他数字都出现了两次。异或运算中,任何一个数字和自己本身异或都是0,任何一个数字和0异或都是本身。
//2. 如果尝试把原数组分成两个子数组,且刚好每个子数组中各自包含一个只出现一次的数字。则在该前提下,每个子数组中,只有一个数字出现了一次,其他数字都出现了两次。
//3. 针对每个子数组,从头到尾依次异或每个数字,则最后留下来的就是只出现了一次的数字。因为出现两次的都抵消掉了。
//4. 怎样实现子数组的划分呢。若对原数组从头到尾的进行异或,则最后得到的结果就是两个只出现一次的数字的异或运算结果。这个结果的二进制表示中,至少有一位为1,因为这两个数不相同。该位记为从最低位开始计数的第n位。
//5. 则分组的标准定为从最低位开始计数的第n位是否为1。因为出现两次的同一个数字,各个位数上都是相同的,所以一定被分到同一个子数组中,且每个子数组中只包含一个出现一次的数字。
【源码3】
链接:https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811来源:牛客网public class Solution { public void FindNumsAppearOnce(int[] array, int[] num1, int[] num2) { int length = array.length; if(length == 2){ num1[0] = array[0]; num2[0] = array[1]; return; } int bitResult = 0; for(int i = 0; i < length; ++i){ bitResult ^= array[i]; } int index = findFirst1(bitResult); for(int i = 0; i < length; ++i){ if(isBit1(array[i], index)){ num1[0] ^= array[i]; }else{ num2[0] ^= array[i]; } } } private int findFirst1(int bitResult){ int index = 0; while(((bitResult & 1) == 0) && index < 32){ bitResult >>= 1; index++; } return index; } private boolean isBit1(int target, int index){ return ((target >> index) & 1) == 1; }}
- 数组中只出现一次的数字(java版)
- 数组中只出现一次的数字(Java实现)
- java 找出数组中只出现一次的数字
- java面试题---数组中只出现一次的数字
- 数组中只出现一次的数字Java实现
- 数组中只出现一次的数字 JAVA
- 数组中只出现一次的数字(数组)
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- poj3126(bfs)
- 《深入理解Java虚拟机》个人读书总结——垃圾收集/回收算法
- 程序员面试金典:双栈排序、二叉平衡检查、输出单层节点
- MySQL 中 You can't specify target table '表名' for update in FROM clause错误解决办法
- javascript的this指向
- 数组中只出现一次的数字(java版)
- SVN---开发必用
- (80)蓝图剖析
- Spring 设计模式之适配器
- Google protobuf
- WebRTC源码分析一:音频处理流程
- 百度实名制
- linux下查找并杀掉tomcat进程
- ArrayList与linkedlist插入效率分析