算法——数组中数字出现的次数(求两个只出现一次的数)

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。

解题思路:

  1. 首先通过一次遍历,获取所有元素的异或值;
  2. 计算异或值中的一个值是1的位,这个位就是答案中两个数字的不同之处;
  3. 利用这个位,在于求部分元素的异或值,哪部分的元素呢?就是分别是这个位为1和0的两个部分,这样就把问题转化为求只出现一次的数字了。
  4. 看代码吧。
class Solution {
    public int[] singleNumbers(int[] nums) {
        int temp = 0;
        int[] res = new int[2];

        for(int n : nums) {
            temp ^= n;
        }

        int k = 0;

        while(((temp >> k) & 1) == 0) k++;

        int temp2 = 0;
        for(int n : nums) {
            if(((n >> k) & 1) == 1) temp2 ^= n;
        }

        temp = 0;
        for(int n : nums) {
            if(((n >> k) & 1) == 0) temp ^= n;
        }

        res[0] = temp;
        res[1] = temp2;

        return res;
    }
}

posted @ 2020-11-13 20:43  lippon  阅读(94)  评论(0编辑  收藏  举报