「每日一题」与面试官手撕代码:如何科学高效的寻找重复元素? (2)

遍历 n 次时间复杂的是 O(n),只用了常量个字符,空间复杂度是 O(1)

5. 只出现一次的数

给定一个数组
nums,除了两个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

示例:输入[1,1,3,4,2,2] 输出[3,4]

思路:可通过问题 1 方式解决。还可以通过位运算解决,和题 4 区别是存在 2 个只出现一次的数,所以要想办法把这两个数区分出来。先将数组所有元素异或,得出的值是两个只出现一次元素 a,b 的异或值 numsXOR(如 10010)。numsXOR 二进制中 1 的位就是 a 和 b 差异位(因为不同的值异或才是 1),现在只需要找 lowbit(最右一位差异值,10),然后通过 lowbit 和 a
, b
进行与运算(&),得出的值就一定不同,这样可以分出 a 和 b,最后按照异或运算就能得出结果(其他重复的不用管,不管分到哪一组,重复的数异或都是 0)

题解:

public int[] singleNumber(int[] nums) { int[] results = new int[]{0,0}; int numsXOR = 0; // 两个数异或值 for (int num : nums) { numsXOR = numsXOR ^ num; } int lowBit = numsXOR & (-numsXOR); // lowbit值,用于区分a和b for (int num : nums) { if ((lowBit & num) == 0) { results[0] = results[0] ^ num; } else { results[1] = results[1] ^ num; } } return results; }

如果上面代码格式出现问题,可以查看下面代码图片

找出任意一个重复数字

遍历 2n 次时间复杂的是 O(n),只用了常量个字符,空间复杂度是 O(1)

各种福利

关注「松宝写代码」,后台回复

1、字节内推福利

回复「校招」获取内推码

回复「社招」获取内推

回复「实习生」获取内推

后续会有更多福利

2、学习资料福利

回复「算法」获取算法学习资料

3、每日一题

本文就是第4道:「每日一题」与面试官手撕代码:如何科学高效的寻找重复元素?

第 3 道「「每日一题」面试官问你对 Promise 的理解?可能是需要你能手动实现各个特性」

https://mp.weixin.qq.com/s/QuuPd2KCp50snN7F2o3oYg

第 2 道「[每日一题]ES6 中为什么要使用 Symbol?」

https://mp.weixin.qq.com/s/omeVJdtabo5MeN3DItDfWg

第 1 道「一道面试题是如何引发深层次的灵魂拷问?」

https://mp.weixin.qq.com/s/O8j9gM5tD5rjLz1kdda3LA

谢谢支持

1、喜欢的话可以「分享,点赞,评论」三连哦。

2、作者昵称:saucxs,songEagle,松宝写代码。字节跳动的一枚前端工程师,一个正在努力成长的作者,星辰大海,未来可期,内推字节跳动各个部门各个岗位。

3、长按下面图片,关注「松宝写代码」,是获取开发知识体系构建,精选文章,项目实战,实验室,每日一道面试题,进阶学习,思考职业发展,涉及到JavaScript,Node,Vue,React,浏览器,http等领域,希望可以帮助到你,我们一起成长~

松宝写代码

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwdyy.html