zoukankan      html  css  js  c++  java
  • 数组中只出现一次的数字(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];
        }
  • 相关阅读:
    用C#实现在线升级
    wordwrap,wordbreak,whitespace,textoverflow的区别和用法[转]
    Sql Server 存储过程分页大全(2005,2000)
    C#中生成中文繁体web页面
    如何在c#里执行sql server DTS包
    asp.net采集函数(采集、分析、替换、入库)
    css定义一个导航栏
    mssql与access的sql语法差异
    [转]sql server数据库定时自动备份
    HttpHandler与图片盗链
  • 原文地址:https://www.cnblogs.com/deltadeblog/p/9551156.html
Copyright © 2011-2022 走看看