当前位置: 首页 > news >正文

【牛客 - 剑指offer】详解 JZ56 数组中只出现一次的两个数字 Java实现(HashMap方案 + 利用异或运算的形式)

文章目录

  • 剑指offer题解汇总 Java实现
  • 本题链接
  • 题目
  • 思路 & 代码
    • 方案一 HashMap
    • 方案二 异或运算


剑指offer题解汇总 Java实现

https://blog.csdn.net/guliguliguliguli/article/details/126089434

本题链接

知识分类篇 - 位运算 - JZ56 数组中只出现一次的两个数字

题目

在这里插入图片描述

思路 & 代码

方案一 HashMap

实现步骤:

  1. 使用HashMap记录数组中每个数字出现的次数
  2. 创建一个大小为2的int数组
  3. 遍历HashMap,把出现次数为1的数字放入数组中
  4. 比较数组中两个数字的大小,将两个数字按照非降序的顺序排列
  5. 最后,将排序好的数组作为返回值即可
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param array int整型一维数组
     * @return int整型一维数组
     */
    public int[] FindNumsAppearOnce(int[] array) {
        // write code here
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int value : array) {
            map.put(value, map.getOrDefault(value, 0) + 1);
        }

        int[] res = new int[2];
        int i = 0;

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == 1) {
                res[i++] = entry.getKey();
            }
        }

        if (res[0] > res[1]) {
            int temp = res[0];
            res[0] = res[1];
            res[1] = temp;
        }

        return res;

    }
}

方案二 异或运算

  • 异或运算满足交换率
  • 相同的数字作异或会被抵消掉,比如:a ^ b ^ c ^ b ^ c = a
  • 任何数字与0异或还是原数字

放到这个题目里面所有数字异或运算就会得到a ^ b,也即得到了两个只出现一次的数字的异或和

但是,我们想要的不是只出现一次的两个数的异或结果,而是具体得到那两个数,可以考虑将数组分成两部分,一部分为 a ^ b ^ c ^ b ^ c = a,另一部分为 b ^ x ^ y ^ y ^ x = b,怎样划分才能让a与b完全分开,且另外的数字也能成对的出现在一个组里呢?这是需要考虑的问题。

解决思路是:

  1. 计算数组中所有数字异或以后的结果temp
  2. 从右向左(其实,从右向左,从左向右都是可以的)遍历temp
  3. 找出二进制中第一位为1的位置,记录这个位置为1所表示的数字k。在 temp 中
    • 如果某一位等于1,那么说明,a 与 b 的二进制形式在这一位上是不相同的
    • 如果某一位等于0,那么说明,a 与 b 的二进制形式在这一位上是相同的

【举例】
2的二进制表示为010
4的二进制表示为100
2 ^ 4 = 010 ^ 100 = 110
从右向左看,第一位为1的是中间那位,说明,两个只出现一次的数字在第二位上的数字是不一样的,2的第二位是0,4的第二位是1

  1. 将数组中其他数字也按照第二位来进行分类,第二位都是1的为一组,进行异或运算,第二位都是0的为一组,进行异或运算,这样就能保证,相同的数字自然会被划分到另一边,且只出现一次的两个数字也会自然地分开

举例
在这里插入图片描述

import java.util.*;

public class Solution {
    public int[] FindNumsAppearOnce(int[] array) {
        int temp = 0;
        int res1 = 0;
        int res2 = 0;
        for (int i : array) {
            temp ^= i;
        }
        int k = 1;
        while ((k & temp) == 0) {
            k <<= 1;
        }
        for (int i : array) {
            if ((i & k) == 0) {
                res1 ^= i;
            } else {
                res2 ^= i;
            }
        }
        if (res1 > res2) {
            return new int[]{res2, res1};
        }
        return new int[]{res1, res2};
    }
}

相关文章:

  • 华为OD机考0017-0018:第K长的字串-逢7过
  • Typora基本使用
  • 2021-03-26 Linux基础
  • Efficient Elements for presentations – Add-in for PowerPoint
  • R语言ggplot2可视化:ggplot2可视化水平半小提琴图(Horizontal Half Violin Plots)
  • 如何在terminal中使用Joplin并像vim一样移动?
  • 下一个排列问题next_permutation
  • SSM传染病监测防控管理系统毕业设计-附源码061525
  • 开题报告:基于java房产中介预约看房网站系统 毕业设计论文开题报告模板
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • 【小程序】中的事件处理详解
  • SSM大学生心理健康服务平台毕业设计-附源码071131
  • springboot绿色食品商城毕业设计-附源码061109
  • 猿创征文|技术成长之路-【Java编程系列】之文件OSS存储实践:Amazon S3实现文件上传下载
  • Docker10:DockerFile的介绍与指令说明
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • 「译」Node.js Streams 基础
  • Codepen 每日精选(2018-3-25)
  • Cumulo 的 ClojureScript 模块已经成型
  • Druid 在有赞的实践
  • gitlab-ci配置详解(一)
  • JavaScript标准库系列——Math对象和Date对象(二)
  • mysql innodb 索引使用指南
  • python docx文档转html页面
  • Ruby 2.x 源代码分析:扩展 概述
  • SQLServer之创建数据库快照
  • SQLServer之索引简介
  • 包装类对象
  • 多线程事务回滚
  • 反思总结然后整装待发
  • 区块链技术特点之去中心化特性
  • 容器服务kubernetes弹性伸缩高级用法
  • 用jQuery怎么做到前后端分离
  • 中国人寿如何基于容器搭建金融PaaS云平台
  • 走向全栈之MongoDB的使用
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • #Ubuntu(修改root信息)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • (6)添加vue-cookie
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (八)Spring源码解析:Spring MVC
  • (独孤九剑)--文件系统
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)鸿鹄云架构一服务注册中心
  • (状压dp)uva 10817 Headmaster's Headache
  • **PHP二维数组遍历时同时赋值
  • .Net CF下精确的计时器
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net 后台导出excel ,word
  • .NET和.COM和.CN域名区别
  • .NET命名规范和开发约定
  • .NET学习全景图
  • .vue文件怎么使用_vue调试工具vue-devtools的安装