【题目】一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
* 【思路】异或性质:数异或自己即为0;
* 一个数组中,从头到尾异或的结果为不重复数字异或结果。成对出现数字异或后抵消。

 package com.exe9.offer;

 /**
* 【题目】一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
* 【思路】异或性质:数异或自己即为0;
* 一个数组中,从头到尾异或的结果为不重复数字异或结果。成对出现数字异或后抵消。
* @author WGS
*
*/
public class FindNumberAppearOnce1 { public void getNumberAppearOnce(int[] arr){
if(arr==null) return ;
int start=0;
//1 先从头至尾依次异或,得到最后的结果。0010(不重复数字异或的结果)
for(int i=0;i<arr.length;i++){
start^=arr[i];
}
//2 由上述得到的结果找到右边第一个1出现的位置;
//int indexOfFirst=findFirstIndexis1(start);
int indexOfOne=0;
while(((start&1)!=1) && (indexOfOne<32)){//位数限制
start=start>>1;
indexOfOne++;//得到位置
}
int num1=0,num2=0;
//3 根据倒数第index位置是否为1将数组arr分成两类,并依次异或,异或的结果即为每个数组中只出现一次的数。
for(int j=0;j<arr.length;j++){
if(isNumOne(arr[j],indexOfOne)){
num1^=arr[j];
}else{
num2^=arr[j];
}
}
System.out.println("只出现一次 的数是:"+num1+","+num2);
}
/*private int findFirstIndexis1(int start) {
int indexOfOne=0;
while(((start&1)!=1) && (indexOfOne<32)){//位数限制
start=start>>1;
indexOfOne++;//得到位置
}
return indexOfOne;
}*/
//判断倒数第indexOfOne位置上是否为1
public boolean isNumOne(int num,int indexOfOne){
num=num>>indexOfOne;
return ((num&1)==1)?true:false; } public static void main(String[] args){
int[] arr=new int[]{2,4,3,6,3,2,5,5};
new FindNumberAppearOnce1().getNumberAppearOnce(arr);
}
}

剑指offer系列44---只出现一次 的数字的更多相关文章

  1. 剑指Offer 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.   思路: 因为有2个数字只出现了一次,而其他的数字都是2次,可以通过异或运算,得到最后这2个只 ...

  2. 剑指Offer——数组中只出现一次的数字

    题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 分析: 数组中一共有偶数个数.两个数字只出现过一次. 相同数异或在一起等于0,那么将所有数异或 ...

  3. 剑指Offer——数组中只出现一次的数字(一个很帅的异或解法)

    题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 看题目脑子里就出现做法了: 遍历,用个HashMap来记录出现的次数,然后再遍历HashMap返回 ...

  4. 用java刷剑指offer(数组中只出现一次的数字)

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 牛客网链接 思路 链接:https://www.nowcoder.com/questionTer ...

  5. 剑指offer系列45---和为s的两个数字

    [题目]输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S, package com.exe9.offer; /** * [题目]输入一个递增排序的数组和一个数字S,在数组中 ...

  6. 干货 | 剑指offer系列文章汇总

    下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现  剑指offer系列  始 剑指offer—灯管问题(1)  剑指offer—10人电梯(2)  ...

  7. 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字

    题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...

  8. 力扣 - 剑指 Offer 57. 和为s的两个数字

    题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...

  9. 【剑指Offer】和为S的两个数字 解题报告(Python)

    [剑指Offer]和为S的两个数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  10. leetcode 136. Single Number 、 137. Single Number II 、 260. Single Number III(剑指offer40 数组中只出现一次的数字)

    136. Single Number 除了一个数字,其他数字都出现了两遍. 用亦或解决,亦或的特点:1.相同的数结果为0,不同的数结果为1 2.与自己亦或为0,与0亦或为原来的数 class Solu ...

随机推荐

  1. ci(转)

    1  从代码管理器签出源文件 2  修改代码 3  编译代码 4  遇到错误,转到2继续修改直到达到预期 5  运行单元测试,期望所有的测试绿色(通过) 6  单元测试出错,转入2 7  重构代码,按 ...

  2. js foreach比for多出两个undefined

    项目中发现,javascript 用foreach会比for多出两个undefined, //会多两个undefined for (var i in _SysFunctions_S) {} //正常 ...

  3. vim 把满足条件的数字进行加上一些数字

    1,1,1,n4s-1 1,3,4,n3s= 1,4,6,e4h= 1,5,8,e4h-1 1,6,2,e3ntx-2 1,7,5,n1s+2 1,8,7,n3s=   比如以上的数据格式以“,”为列 ...

  4. 关于时间的util类,以后方便查阅

    public static int lastDayOfMonth(int year, int month)  {    if (month == 2)    {      if (isLeapYear ...

  5. jq事件冒泡问题

    在程序中使用事件对象非常简单,只需为函数添加一个参数,jquery代码如下: $("element").bind("click",function(event) ...

  6. C++ Primer : 第十二章 : 动态内存之动态内存管理(new和delete)

    C++语言定义了两个运算符来分配和释放动态内存:运算符new分配内存,运算符delete释放new分配的内存. 运算符new和delete 使用new动态分配和初始化对象 在自由空间分配的内存是无名的 ...

  7. 转:db2 iptables相关用法(1)

    如果你的IPTABLES基础知识还不了解,建议先去看看. 开始配置 我们来配置一个filter表的防火墙. (1)查看本机关于IPTABLES的设置情况 [root@tp ~]# iptables - ...

  8. UVa 699 下落的树叶

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. HDU 5234 Happy birthday --- 三维01背包

    HDU 5234 题目大意:给定n,m,k,以及n*m(n行m列)个数,k为背包容量,从(1,1)开始只能往下走或往右走,求到达(m,n)时能获得的最大价值 解题思路:dp[i][j][k]表示在位置 ...

  10. poj1420 拓扑序

    题意:给出一个表格,一部分单元格是给定的数字,而另一部分单元格则是一个式子,表示是其他一些单元格的和,让你输出最后计算出的所有格子的数. 因为有些格子需要其他格子先计算出来,所以计算顺序是按照拓扑序的 ...