I. 数组中数字出现的次数(中等)

题目描述

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

示例1

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]

示例2

输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

做题思路

1. 异或运算的性质为两个相同数字异或为0,因此我们可以通过对数组中的所有数字执行异或运算,留下的结果为出现一次的数字。

2.本题的难点在于需要在数组中找到两个只出现一次的数字,因此无法通过异或直接得到这两个数字。

3.设两个只出现一次的数字为x,y,由于两个数不相等,因此二者异或运算后得到的数字z中至少有一位是1,我们需要找到z最低位的1,用m来标记,以此来拆分成分别包含x和y的两个子数组,对每个子数组执行步骤1的方法。

4.返回x,y。

代码

class Solution {
    public int[] singleNumbers(int[] nums) {
        int z=0;
        //遍历异或整个数组
        for(int num:nums){
            z^=num;
        }
        int m=1;
        //标记z中1所在的最低位
        while((z&m)==0){
            m<<=1;
        }
        int x=0,y=0;
        //将只出现一次的不同的两个数字拆分到两个不同的数组
        for(int num:nums){
            if(((num&m)==0)){
                x^=num;
            }else{
                y^=num;
            }
        }
        return new int[]{x,y};
    }
}

你可能感兴趣的:(leetcode,java,leetcode)