• 260. 只出现一次的数字 III


    题目

    alt

    题解

    题解一
    • 直接使用 HashSet 判断
    class Solution {
        public int[] singleNumber(int[] nums) {

            Set 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
    题解二
    • 对数组所有元素求 异或,得到的值为那两个不同元素的 异或结果
    • 明确那两个数肯定不同,所以肯定有的位数 异或后结果为 1
      • 假如第 x 位异或的结果为 1,即所有数的 x 位异或结果为 1
      • 找到 x 的最小值
    • 现在数组中只有两类数:x 位为 0 的,和 x 位为 1 的,并且这两个不同的数的 x 位还不同
    • 通过 & 操作,将数组氛围两类
    • 最后问题拆解为 136.只出现一次的数字
    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};
        }

    }
    • 1

    本文由 mdnice 多平台发布

  • 相关阅读:
    【工具】工具小集
    【标准解读】物联网安全的系统回顾
    Kotlin协程:Dispatchers.IO线程池原理
    常见树种(贵州省):006栎类
    C++ Qt开发:StandardItemModel数据模型组件
    linux系统如何定时关机
    【ADI低功耗2k代码】基于ADuCM4050的ADXL363、TMP75的加速度、温度检测及串口打印、蜂鸣器播放音乐(孤勇者)
    ERP库存管理
    深入理解Java消息中间件-每种解决方案的特点和适用场景
    算法通过村第十四关-堆|青铜笔记|堆结构
  • 原文地址:https://blog.csdn.net/qq_36535538/article/details/133871336