剑指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 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ...
随机推荐
- dev-sidecar 让github 可以正常访问
dev-sidecar https://gitee.com/docmirror/dev-sidecar/releases
- KTL 一个支持C++14编辑公式的K线技术工具平台 - 第九版,数据分析工具。支持通达信日线数据。增强即时插件编程体现。
K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL 国内仓库 ...
- 菜鸟角度简单分析BP算法(Error Back Propagation)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 记录--基于Vue2.0实现后台系统权限控制
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 基于Vue.js 2.x系列 + Element UI 的后台系统权限控制 前言:关于vue权限路由的那些事儿-- 项目背景:现有一个后台 ...
- 无人不识又无人不迷糊的this
本文分享自华为云社区<3月阅读周·你不知道的JavaScript | 无人不识又无人不迷糊的this>,作者: 叶一一. 关于this this关键字是JavaScript中最复杂的机制之 ...
- C#通过文件头判断flv文件
代码如下: private void button1_Click(object sender, EventArgs e) { string path = Application.StartupPath ...
- KingbaseES V8R6集群部署案例之---openEuler系统脚本部署故障
案例说明: 在openEuler系统下通过脚本方式部署KingbaseES V8R6集群,脚本执行过程中,加载vip失败.本次故障问题,主要是因为openEuler系统shell和脚本的不兼容引起. ...
- KingabseES例程之巧用QueryMapping解决查询硬解析问题
什么是QueryMapping KingbaseES Query Mapping 是一种查询映射功能.有过SQL优化经历的人都知道,对于有些SQL性能问题,可能需要涉及到SQL层面的修改,这不仅麻烦, ...
- python爬虫反爬之快速配置免费IP代理池(ProxyPool)
关注我的公众号[靠谱杨阅读人生]回复ProxyPool可以免费获取网盘链接. 也可自行搜索下载:https://github.com/Python3WebSpider/ProxyPool.git 1. ...
- Linux服务器程序规范化
Linux日志体系 rsyslogd守护进程既能接收用户进程输出的日志,又能接收内核日志.用户进程是通过调用syslog函数生成系统日志的.该函数将日志输出到一个UNIX本地域socket类型(AF_ ...