文章目录
1. 面试题 01.01. 判定字符是否唯一
解法:通过位运算来对已出现的字符进行标记。具体如下:总是以字符a为第一位,如"a",则标记为1,“ac”, 则标记为101,"acd"则标记为1101。
(2)代码如下:
def isUnique(self, astr: str) -> bool:
mark = 0 # 1.用来标记哪些符号已经出现了
for char in astr:
distance = ord(char) - ord('a') # 2.ord('a')算a的ascii码,如 ord('a')=97
if (mark & (1<<distance)) != 0: # 3.说明有重复
return False
else: # 4.无重复
mark = mark | (1<<distance) # 5.将该字符添加到mark中
return True
2. 回文排列
解法1:哈希表统计
思想非常简单,用哈希表统计个数即可
解法2: 位运算*
思想非常有意思
Step1: 通过位运算标记字符个数
Step2: 通过异或运算,记录同一字符为奇数个,还是偶数个;
Step3: 重点,最后的结果-1,判断结果中的1是否只有一个或0个,太秒了。
5. 一次编辑
解法: 前后双指针
记正向遍历结束first距离末尾dis0,second距离末尾dis1,反向遍历结束两个值分别为dis2、dis3,那么只需要判断两个差值是否小于2即可。 如果差值为0,说明两者只有一个地方不一样,如果差值为1,说明只需要进行一次插入/删除即可,如果差值大于1,说明至少有两个地方不一样,返回false。考虑特殊情况,当dis0 = 0时,dis2 = first.size(),这个时候dis0 - dis2 显然是小于2的,可以统一到这个式子里面。
比如对于abcdefghi和abcccghi这两个串,我们先正向遍历,第一次冲突时,离末尾分别为 6 和 5,再进行反向遍历,第一次冲突时,离末尾分别为 4 和 4,而6 - 4则为两次冲突之间的元素个数,这里为2,很显然不能仅一次修改使两者相同。因此返回false。
题解链接
代码如下:
7. 旋转矩阵
解法:坐标变换
设矩阵的维度为: N x N,原坐标为(i,j),则变换后的坐标为:
变
换
后
的
横
坐
标
=
原
纵
坐
标
j
变换后的横坐标 = 原纵坐标j
变换后的横坐标=原纵坐标j
变
换
后
的
纵
坐
标
=
N
−
1
−
i
变换后的纵坐标 = N-1-i
变换后的纵坐标=N−1−i
代码及结果:
8. 零矩阵
解法1:位运算标记
通过位运算标记数字为0的横纵坐标,然后再遍历归零。
代码:
9.字符串轮转
解法:s1: xy,组合为xyxy就包含xy旋转(s2)的所有情况,然后判断s2 in xyxy?即可
代码: