【优选算法5】位运算经典算法面试题

1.基础位运算知识详解

2. 判定字符是否唯一

解法:位运算

每个比特位,标记是否出现过。

接下来:利用1.的基础位运算技巧,使每个比特位变成0 、1 ,最后得出结果。

3. 丢失的数字

思路1:哈希表

思路2:高斯求和

思路3:位运算:异或性质

用一个 ret 异或整个数组,然后异或[ 0 - n ],异或同乘除,满足交换律,不影响结果

并且,相同的数异或会抵消,异或0不变,最终留下唯一的那个"缺失"的数字

4. 两整数之和

思路:位运算

利用位运算,将二进制的表达式相加,就能达成要求。

根据1. ,两数异或,就是无进位相加。那进位怎么处理?模拟一下过程才知道:

按位与后,左移,就是需要的进位!

进位后,继续相异或,然后相与,直到进位为0:即b为0:

5. 只出现一次的数字 II

思路:位运算 + 比特位 % n

因为是计算nums中每个数字每一位相加,所以外层循环一次,统一右移动nums元素i位,判断是否为1,是的话就记数,记数完整个数组每一个比特位,再依次%3,看下列公式

是1,就改为1,是0就不变,因为提供的ret本身为0,提供其他的除外。

6.消失的两个数字

位运算 + 分组异或 分离答案

数组中与1-n全部异或一遍,得到的tmp就是a异或b的结果。

由于两数必定不同,异或的结果肯定有一位是不同的:

假设a那一位是1,b那一位是0:

按照异或的性质:位相异为1,找出第一个低位不同的,标记为diff

找到后,原数组的值被分为两类:

diff位为1的,归位a类,diff位为0的,归位b类。

这样,a,b就被分为两组,每组都只有一个不同的数字。问题就转化为只有一个不同的数字。

将他们全部与1-n中,diff为也为0或1的,一起异或。

就能抵消组中相同的,a组留下a,b组留下b

最后返回{a,b}

相关推荐
汉克老师1 小时前
GESP5级C++考试语法知识(十四、分治算法(一))
算法·归并排序·排序·分治算法·gesp5级·gesp五级
杨运交1 小时前
[014][web模块]构建可重复读取的请求体:Spring Boot 请求缓存过滤器设计与实现
后端
郝学胜-神的一滴1 小时前
干货版《算法导论》03:动态数组 × 链表的极致平衡艺术
java·数据结构·c++·python·算法·链表
didadida2621 小时前
子路径部署 Vue/React 应用偶发白屏
前端·后端
SamDeepThinking1 小时前
IntelliJ IDEA 中有什么让你相见恨晚的技巧?
java·后端·程序员
SamDeepThinking1 小时前
为什么选微服务而不是动态扩容单体
java·后端·架构
风筝在晴天搁浅1 小时前
字节 LeetCode CodeTop 912.排序数组
算法·leetcode
Liangwei Lin1 小时前
LeetCode 48. 旋转图像
算法
uzong1 小时前
每位工程师都必须掌握的十大数据库扩容策略
后端·架构