• 数组中只出现一次的数字(java实现)


     

    问题描述

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

    解题思路

    如果数组中只有一个数字出现奇数次,则将数组中所有的数字做异或可得该数字。

    数组中有两个数字出现奇数次,设这两个数字分别为a、b,则将数组中所有的数字做异或得到的是a与 b异或的结果,设为xor。

    数字a与b不同,则a与b的二进制表示中至少存在1位不同,xor二进制表示中为1的位即是a与b不同的位,假设a与b的第k位不同,a在该位上为1,b在该位上为0 。(k可以选取为从起始位开始的第一个不同的位)

    则可以根据数字第k位的取值情况将数组分为两个字数组,第k位为1的子数组必包含a与其他出现偶数次的数字(相同的数字第k位肯定相同),第k位为0的子数组必包含b与其他出现偶数次的数字。

    子数组中的数字做异或可分别得到数字a与b。

    实现代码

        //num1,num2分别为长度为1的数组。传出参数
        //将num1[0],num2[0]设置为返回结果
        public void findNumsAppearOnce(int[] array, int num1[], int num2[]) {
            // 得到两个数字的异或结果xor
            int xor = 0;
            for (int i=0; i<array.length; i++) xor ^= array[i];
    
            // 求两个数字第一个不同的位, 有temp记录
            // 若temp=00100000 表示两个数字的第6位不同
            int temp = 1;
            while ((xor & 1) != 1) {
                temp = temp << 1;
                xor = xor >> 1;
            }
    
            // 根据temp将数组分为两个子数组,并分别做异或
            num1[0] = 0;
            num2[0] = 0;
            for (int i=0; i<array.length; i++)
                if ((array[i]&temp) == temp) num1[0] ^= array[i];
                else num2[0] ^= array[i];
        }
  • 相关阅读:
    3dsmaxunity3d
    libav android移植交叉编译
    libav 由显卡中读取数据制作视频
    超详细mysql left join,right join,inner join用法分析
    VC常见入门问题总结
    c#皮肤美化
    论坛
    vc中文件的读写操作
    MySQL的mysqldump工具的基本用法
    perl产生随机数
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9551156.html
Copyright © 2020-2023  润新知