博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer第40题
阅读量:5221 次
发布时间:2019-06-14

本文共 1835 字,大约阅读时间需要 6 分钟。

1 package com.yan.offer; 2  3 /** 4  * 题目描述: 5  *  6  * 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 7  *  8  * @author Yan 9  *10  */11 public class ArrayFindSingleNum {12 13     public ArrayFindSingleNum() {14     }15 16     private static int[] arr = new int[] { 2, 4, 3, 6, 3, 2, 5, 5 };17 18     public static void main(String[] args) {19         ArrayFindSingleNum arrayFindNum = new ArrayFindSingleNum();20         int[] num1 = new int[1];21         int[] num2 = new int[1];22         arrayFindNum.findNumsAppearOnce(arr, num1, num2);23         System.out.println(num1[0] + " " + num2[0]);24     }25 26     // num1,num2分别为长度为1的数组。传出参数27     // 将num1[0],num2[0]设置为返回结果28     public void findNumsAppearOnce(int[] array, int[] num1, int[] num2) {29         if (array == null || array.length == 0 || array.length == 1) {30             return;31         }32         int sum = 0;33         // 将数组中所有元素进行异或。34         for (int i = 0; i < array.length; i++) {35             sum ^= array[i];36         }37         int temp = sum;38         int flag = 1;39         // 判断异或结果中低位起第一个为1的位,即为flag为1的位。40         while (true) {41             if ((temp & flag) != 0) {42                 break;43             } else {44                 flag = flag << 1;45             }46         }47         int sum1 = 0;48         int sum2 = 0;49         // 利用为1的位将数组中的元素分为两部分,一部分为该位为0的元素,另一部分为该位为1的元素。50         // 因为不相同的两个数的异或值中该位为1,所以这两个数该位是不同的,所以这两个数就被分到了两个不同的部分。51         // 因此,分别将每一部分进行全部异或,最终得到的结果分别为两个不相同的数。52         for (int i = 0; i < array.length; i++) {53             if ((array[i] & flag) != 0) {54                 sum1 ^= array[i];55             } else {56                 sum2 ^= array[i];57             }58         }59         num1[0] = sum1;60         num2[0] = sum2;61 62     }63 64 }

 

转载于:https://www.cnblogs.com/yanspecial/p/5604986.html

你可能感兴趣的文章
团队报告
查看>>
GridView 72般绝技 (http://blog.csdn.net/21aspnet/)
查看>>
win7创建共享给windows和linux机器
查看>>
Window.open()方法参数详解
查看>>
Hadoop1 集群安装实验
查看>>
java RE Validation常用
查看>>
GNU make使用(一)
查看>>
How to change MAC address in windows 7
查看>>
log4net的各种Appender配置示例
查看>>
JointCode.Shuttle,一个简单高效的跨 AppDomain 通信的服务框架
查看>>
第二次绩效评估
查看>>
Java中 VO、 PO、DO、DTO、 BO、 QO、DAO、POJO的概念
查看>>
迅为iTOP-4412开发板-驱动-显卡支持HDMI_1080P分辨率
查看>>
hive 导出数据到本地
查看>>
SQL点点滴滴_DELETE小计
查看>>
Jquery选择器
查看>>
python 类型转换
查看>>
Swift供选链接
查看>>
每天进步一点点--&gt;功能fseek() 使用方法
查看>>
Spring核心技术
查看>>