力扣刷题_《程序员面试经典》

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 =N1i
代码及结果:
在这里插入图片描述

8. 零矩阵

解法1:位运算标记

通过位运算标记数字为0的横纵坐标,然后再遍历归零。
代码:
在这里插入图片描述

9.字符串轮转

解法:s1: xy,组合为xyxy就包含xy旋转(s2)的所有情况,然后判断s2 in xyxy?即可

代码:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值