package com.yan.offer;

 /**
* 题目描述:
*
* 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
*
* @author Yan
*
*/
public class ArrayFindSingleNum { public ArrayFindSingleNum() {
} private static int[] arr = new int[] { 2, 4, 3, 6, 3, 2, 5, 5 }; public static void main(String[] args) {
ArrayFindSingleNum arrayFindNum = new ArrayFindSingleNum();
int[] num1 = new int[1];
int[] num2 = new int[1];
arrayFindNum.findNumsAppearOnce(arr, num1, num2);
System.out.println(num1[0] + " " + num2[0]);
} // num1,num2分别为长度为1的数组。传出参数
// 将num1[0],num2[0]设置为返回结果
public void findNumsAppearOnce(int[] array, int[] num1, int[] num2) {
if (array == null || array.length == 0 || array.length == 1) {
return;
}
int sum = 0;
// 将数组中所有元素进行异或。
for (int i = 0; i < array.length; i++) {
sum ^= array[i];
}
int temp = sum;
int flag = 1;
// 判断异或结果中低位起第一个为1的位,即为flag为1的位。
while (true) {
if ((temp & flag) != 0) {
break;
} else {
flag = flag << 1;
}
}
int sum1 = 0;
int sum2 = 0;
// 利用为1的位将数组中的元素分为两部分,一部分为该位为0的元素,另一部分为该位为1的元素。
// 因为不相同的两个数的异或值中该位为1,所以这两个数该位是不同的,所以这两个数就被分到了两个不同的部分。
// 因此,分别将每一部分进行全部异或,最终得到的结果分别为两个不相同的数。
for (int i = 0; i < array.length; i++) {
if ((array[i] & flag) != 0) {
sum1 ^= array[i];
} else {
sum2 ^= array[i];
}
}
num1[0] = sum1;
num2[0] = sum2; } }

最新文章

  1. 两个单选按钮(一个是,一个否 ),一个div层,实现点击隐藏,显示div
  2. Oracle数据块损坏篇之10231内部事件
  3. nginx 常用配置说明
  4. C++ list 类学习笔记
  5. ITPub 上的一道题,学习下思路
  6. Java学习----你可以知道对象的工作结果(获取方法的返回值)
  7. VS2010 快捷键--我的总结
  8. HttpContext.Cache和Application的区别
  9. JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法
  10. #417 Div2 C
  11. 一次从0到1的java项目实践清单
  12. CSS3新增伪类汇总
  13. Linux查询进程和结束进程
  14. OI养老专题01:约瑟夫问题
  15. ubuntu16.04 HyperLedger Fabric 1.2.0 开发环境搭建
  16. 【第一部分】07Leetcode刷题
  17. Luogu P1962 斐波那契数列(矩阵乘法模板)
  18. shell of leetcode
  19. linux ssh keys
  20. TLS协议(安全传输层协议)

热门文章

  1. eshop2-linux 软件源配置 and 建议
  2. Spring boot application.properties和 application.yml 初学者的学习
  3. PHP计划任务
  4. mqtt已断开连接(32109)
  5. mybatis插入数据后将其ID返回
  6. P1048 数字加密
  7. XV6操作系统代码阅读心得(五):文件系统
  8. cf 398B. Painting The Wall
  9. Java笔记: protected的真正含义
  10. POJ 2632:Crashing Robots