剑指Offer40:数组中只出现一次的数字(Java)

参考hezhiyao的博客 https://www.cnblogs.com/hezhiyao/p/7539024.html
参考qmss的博客 https://www.jianshu.com/p/c308e4a1e19f
参考Raise的博客 https://blog.csdn.net/linraise/article/details/9425319

思路分析:

利用两个相同的数异或为0的性质,两个不为零且不同的数异或运算结果的二进制形式一定有1的性质
解题步骤:
1. 把数组从左到右全部异或运算得到一值
2. 求该值二进制最低位1的位置index
3. 按照index是1还是0把原数组分成两组,划分两组是逻辑划分,每组都连续异或运算会分别得到两个出现一次的数字。

更详细的解析可以看这几篇博客,他们写的比我好很多,尤其是后两篇更适合像我一样的小白

(整体宏观)hezhiyao的博客 https://www.cnblogs.com/hezhiyao/p/7539024.html
(不懂代码中的异或运算,与运算细节的)qmss的博客 https://www.jianshu.com/p/c308e4a1e19f
Raise的博客 https://blog.csdn.net/linraise/article/details/9425319

题目描述:

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

Java代码:

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        int res=0;
        for(int i=0;i<array.length;i++){
            res ^=array[i];
        }
        int index=0;
        while(true){//有的代码是for循环,且循环次数i<32;我不懂为什么只循环32次?
            if((res>>index&1)==1){
                break;
            }
            index++;
        }
        for (int i=0;i<array.length;i++){
            if((array[i]>>index &1)==1){
                num1[0] ^=array[i];
            }
            else num2[0] ^=array[i];
        }
    }
}

原文地址:https://www.cnblogs.com/dongmm031/p/12244880.html

时间: 2024-11-05 20:47:11

剑指Offer40:数组中只出现一次的数字(Java)的相关文章

剑指Offer--040-数组中只出现一次的数字

链接 牛客OJ:数组中只出现一次的数字 九度OJ:http://ac.jobdu.com/problem.php?pid=1351 GitHub代码: 040-数组中只出现一次的数字 CSDN题解:剑指Offer–040-数组中只出现一次的数字 牛客OJ 九度OJ CSDN题解 GitHub代码 040-数组中只出现一次的数字 1351-数组中只出现一次的数字 剑指Offer–040-数组中只出现一次的数字 040-数组中只出现一次的数字 题意 题目描述 一个整型数组里除了两个数字之外,其他的数

剑指offer---数组中只出现一次的数字

//除了两个数字 A和B不相等 所以异或完以后的C C为1的某一位上 A和B在这一位上肯定是相异的 //不然不会异或为1 所以按这一位上为零或者为1来把数组分为两个 //因为同一个数是不可能被分到两个组的 //简化为只有一个数字外 其余都出现两次的这个问题 class Solution { public: int find(int num) { int result=0; while(((num&1)==0)&&result<32) { num=num>>1; +

【剑指offer】数组中只出现一次的数字(1)

转载请注明出处:http://blog.csdn.net/ns_code/article/details/27649027 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3

[剑指Offer]40.数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路 我们直到异或的性质: 任何一个数字异或他自己都等于0. 所以说我们如果从头到尾依次异或每一个数字,那么最终的结果刚好只出现一次的数字,因为成对出现的两次的数字全部在异或中抵消了. 这道题中有两个数字只出现一次.这样的话我们得到的结果就是这两个数字的异或结果.因此我们想办法把原数组分成两个子数组,使得每个子数组包含一个只出现一次的数字.这样我们就可以对这两个子数组分别异或,就能得到两个只出现一

数组中只出现一次的数字(剑指offer)思维有点巧

数组中只出现一次的数字 参与人数:1144时间限制:1秒空间限制:32768K 通过比例:21.75% 最佳记录:0 ms|0K(来自  牛客563536号) 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目链接:http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?rp=2&ru=/ta/coding-interviews&qru=/ta/coding

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

数组中只出现一次的数字 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路 先考虑一个数组里只有一个数出现一次,其他两个数都出现两次的情况:一个数跟自己异或后为0,一个数组里只有一个数出现一次其他两次,挨个异或后最后得到的结果就是只出现一次的那个数. 我们把这个数组分为两部分,每部分只有一个数只出现一次:我们分的时候,把所有数都异或后,得到的结果肯定不为0,其实是那两个只出现一次的不同的数的异或,我们从低位到高危找到第一个不为0的那位,异

剑指offer系列源码-数组中只出现一次的数字

题目1351:数组中只出现一次的数字 时间限制:1 秒内存限制:32 兆特殊判题:否提交:2582解决:758 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小.2<=n <= 10^6. 第二行包含n个整数,表示数组元素,元素均为int. 输出: 对应每个测试案例,输出数组中只出现一次的两个数.输出的数字从小到大的顺序. 样例输入: 8 2 4 3 6 3 2 5 5

编程算法 - 数组中只出现一次的数字 代码(C)

数组中只出现一次的数字 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 一个整型数组里除了两个数字以外, 其他的数字都出现了两次. 请写程序找出这两个只出现一次的数字. 如果从头到尾依次异或数组中的每一个数字, 那么最终的结果刚好是那个只出现一次的数字. 根据结果数组二进制某一位为1, 以此分组, 为1的一组, 为0的一组, 再重新进行异或. 最后得出两个结果. 时间复杂度O(n). 代码: /* * main.cpp * * Create

【01】数组中只出现一次的数字

其他两次,一个一次/其他三次,一个一次/其他两次,两个一次 ============================================ 任何一个数字异或他自己都得零. 注意异或运算的初始化变量为0,因为0异或任何数字都得那个数字自身. Single Number 1.一个整型数组中除了一个数字之外,其他数字都出现了两次 ,找出这个出现一次的数字. 解法一,异或是重复的消失,剩下的就是要找的数字. C++ Code 12345678910111213   int singleNumb