剑指offer56(Java)-数组中出现的次数Ⅰ(中等)
题目:
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
限制:
2 <= nums.length <= 10000
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
暴力求解:哈希表,但是不符合空间复杂度
先用哈希表统计出每个数字出现的次数,由于只有两个数字出现了一次,然后遍历哈希表,将出现一次的数字放入长度为2 的数组中返回即可。
1 class Solution {
2 public int[] singleNumbers(int[] nums) {
3 Map<Integer,Integer> map = new HashMap<>();
4 int i = 0;
5 for(int num : nums){
6 map.put(num, map.getOrDefault(num,0) + 1);
7 }
8 int[] ans = new int[2];
9 for (Integer key: map.keySet()){
10 if (map.get(key) == 1) {
11 ans[i] = key;
12 i++;
13 }
14 }
15 return ans;
16 }
17 }
异或:
异或公式:
① 交换律:A ^ B ^ C = A ^C ^ B
② A^ A = 0
③ A ^ 0 = A
故一个数组的元素进行异或:
比如:[2,4,2,3,3,6] 异或:2^4^2^3^3^6 = 4 ^ 6 ^(2^2)^(3^3) = 4 ^ 6 = 0100 ^ 0110 = 0010
思路:
①先将数组中的所有值进行异或,得到异或结果xor:

②设第一个为1的二进位为最后一位即0001,即设m = 1,让 m 不断左移来与xor做 与运算(相同为1)来找到第一位为1 的二进制位:
例如:
若x&0001=1,则a 的第一位为1,
若x&0010=1,则a 的第二位为1;
以此类推……
③根据num ^ m 是否等于0来差分数组。
具体过程可以看:K神老师以及评论区的解释

代码:
1 class Solution {
2 public int[] singleNumbers(int[] nums) {
3 int xor = 0;
4 //计算所有值的异或结果
5 for (int num : nums){
6 xor ^= num;
7 }
8 int m = 1;
9 //找到第一位为1的二进制位,即当 m & xor = 1,保存m
10 while ((m & xor) == 0){
11 //m左移1位
12 m <<= 1;
13 }
14 //利用m来将数组分组
15 //[4,1,4,6] xor = 1 ^ 6 = 0111,m = 0001
16 //num & m = 0的为一组:[4,4,6]
17 //num & m = 1的为一组:[1]
18 int x = 0, y = 0;
19 for (int num : nums){
20 if ((num & m) == 0){
21 x ^= num;
22
23 }
24 else{
25 y ^= num;
26 }
27 }
28 return new int[]{x,y};
29 }
30 }
剑指offer56(Java)-数组中出现的次数Ⅰ(中等)的更多相关文章
- 《剑指offer》数组中出现一半次数的数字
本题来自<剑指offer> 反转链表 题目: 思路: C++ Code: Python Code: 总结:
- 剑指Offer:数组中出现次数超过一半的数字【39】
剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...
- 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组
剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...
- 《剑指offer》数组中只出现一次的数字
本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ...
- 剑指offer--二维数组中查找
剑指offer--二维数组中查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序, 每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组 ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法
剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...
- 剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...
- 菜鸟刷题路:剑指 Offer 03. 数组中重复的数字
剑指 Offer 03. 数组中重复的数字 哈希表/set class Solution { public int findRepeatNumber(int[] nums) { HashSet< ...
- 剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [ ...
- 5.1 剑指 Offer 03. 数组中重复的数字
类型题:剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ...
随机推荐
- vscode 对js文件不格式化的修正方案 settings.json
修正1 "javascript.format.enable": true, // 这里false 改true 修正2 注释掉这个地方 // "[javascript]&q ...
- Multi-Runtime多运行时架构
概念 Multi-Runtime Multi-Runtime 是一种服务端架构思路,把应用里的所有中间件挪到 Sidecar 里,使得"业务运行时"和"技术运行时&quo ...
- 音频信号质量的度量标准--MOS得分的由来
早期语音质量的评价方式是凭主观的,人们在打通电话之后通过人耳来感知语音质量的好坏.1996年国际ITU组织在ITU-T P.800和P.830建议书开始制订相关的评测标准:MOS(Mean Opini ...
- day12-面向对象03
面向对象03 10.抽象类 abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法:如果修饰类,那么该类就是抽象类 抽象类中可以没有抽象方法,但是有抽象方法的类一定要 ...
- 4项关键技术提升 XR 扩展现实体验-XR应用云流化
无论是使用户能够协作设计电动赛车,还是帮助观众通过数字世界与自然互动,越来越多的企业利用XR扩展现实为用户提供沉浸式逼真的虚拟环境. 下一代沉浸式技术的应用越来越广泛,图形和人工智能的最新突破正在扩展 ...
- PagerAdapter深度解析和实践优化
目录介绍 01.PagerAdapter简单介绍 02.PagerAdapter抽象方法 03.PagerAdapter原理介绍 04.PagerAdapter缓存和销毁 05.自定义PagerAda ...
- LocalDate获取指定月的上个月的第一天和最后一天
LocalDate date = LocalDate.of(2022, 8, 30); LocalDate lastMonth = date.minusMonths(1); // 当前月份减1 Loc ...
- 在ubuntu安装QT
在ubuntu安装 安装motrix motrix下载 下载对应版本的QT QT下载 授权run文件 sudo chmod +x xxx.run 运行run文件 ./ xxx.run 运行界面 安装完 ...
- 内核模块的makefile规则详解
内核中的Makefile 这里主要对内核源码各子集目录中的Kbulid(内核的编译系统)Makfile进行简单介绍 这部分式内核驱动或设备驱动开发这最长接触到的 Makefile 的语法包括几个方面 ...
- Rust 实现日志记录功能
目录 log 日志库标准 简单示例 使用方法 库的开发者 应用开发者 日志库开发者 使用 log4rs 添加依赖 配置文件 运行项目 参考文章 log 日志库标准 log 是 Rust 的日志门面库, ...