美文网首页
剑指 Offer 56 - I. 数组中数字出现的次数

剑指 Offer 56 - I. 数组中数字出现的次数

作者: BitterOutsider | 来源:发表于2020-11-24 11:10 被阅读0次

    题目描述

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

    解题思路

    • a ^ b,若a == b,则为0,若a != b,则不为0。可以用异或来去除相同的数字,剩下的结果一定是两个不同数字异或的结果,表示为n
    • 由于无法从n看出是哪两个数的异或结果,所以我们必须进行分组异或。我们知道同位上的数字如果不一样,异或结果是1。所以我们可以根据这一位,将所有的数字分为两类。这样既保证了,相同的数分到了一组,两个不同的数分到不同的组。
      • 我们定义div = 1,与n进行与操作,若是0则表示该位是0,将div左移一位,如10,100……。
    • 如此分为两类后,就可以将两组分别做异或操作,得到两个数字,就是结果。
    class Solution {
        public int[] singleNumbers(int[] nums) {
            int n = 0;
            for (int number : nums) {
                n ^= number;
            }
            int div = 1;
            while ((div & n) == 0) {
                div <<= 1;
            }
            int a = 0;
            int b = 0;
            for (int number : nums) {
                if ((div & number) == 0) {
                    a ^= number;
                } else {
                    b ^= number;
                }
            }
            return new int[]{a, b};
        }
    }
    

    相关文章

      网友评论

          本文标题:剑指 Offer 56 - I. 数组中数字出现的次数

          本文链接:https://www.haomeiwen.com/subject/qtkiiktx.html