260. 只出现一次的数字 III

题目

题解

题解一

  • 直接使用 HashSet 判断
java 复制代码
class Solution {
    public int[] singleNumber(int[] nums) {

        Set<Integer> set = new HashSet<>();
        for (int num : nums) {
            if (set.contains(num)) {
                set.remove(num);
            } else {
                set.add(num);
            }
        }
        int[] res = new int[2];
        int index = 0;
        for (Integer i : set) {
            res[index++] = i;
        }
        return res;
    }
}

题解二

  • 对数组所有元素求异或,得到的值为那两个不同元素的异或结果
  • 明确那两个数肯定不同,所以肯定有的位数异或后结果为 1
    • 假如第 x 位异或的结果为 1,即所有数的 x 位异或结果为 1
    • 找到 x 的最小值
  • 现在数组中只有两类数:x 位为 0 的,和 x 位为 1 的,并且这两个不同的数的 x 位还不同
  • 通过 & 操作,将数组氛围两类
  • 最后问题拆解为 136.只出现一次的数字
java 复制代码
class Solution {
    public int[] singleNumber(int[] nums) {

        // 两个不同数的异或值
        int tmp = 0;
        for (int num : nums) {
            tmp = tmp ^ num;
        }
        // 两个数不同,tmp 肯定不为 0,得到最后为 1 的位
        // 4  -> 100
        // -4 -> 11111111111111111111111111111100
        // 4 & -4 -> 100
        int fg = tmp & -tmp;

        // 数组里面所有数的该位要么是 0,要么是 1,且与运算之后最终结果是 1
        int res1 = 0;
        int res2 = 0;
        for (int num : nums) {
            if ((num & fg) == 0) {
                res1 = res1 ^ num;
            } else {
                res2 = res2 ^ num;
            }
        }
        return new int[]{res1, res2};
    }

}

本文由mdnice多平台发布

相关推荐
修己xj2 小时前
三月,我只想做好这四件事
程序员
不要秃头啊8 小时前
别再谈提效了:AI 时代的开发范式本质变了
前端·后端·程序员
jonjia9 小时前
引入新维度化解权衡难题
程序员
jonjia9 小时前
优秀的工程师如何打破规则
程序员
jonjia9 小时前
在大厂交付大型项目的策略
程序员
jonjia9 小时前
RFC 与设计文档
程序员
jonjia9 小时前
为什么你(或任何人)应该成为一名研发经理?
程序员
jonjia9 小时前
管理技术质量 (Manage Technical Quality)
程序员
jonjia9 小时前
大厂软件工程师职业发展路径
程序员
jonjia9 小时前
关于工程师与影响力
程序员