回文数
链接:题目链接
题目描述
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
解题思路–普通逻辑
我们可以不用转换成字符串来处理,用%和//即可,用一个循环,终止条件是右半部分>=左半部分,这里其实是个小技巧,不管整数的位数是奇数还是偶数,都适用
代码实现
class Solution:
def isPalindrome(self, x: int) -> bool:
# 一些情况可以特判,直接跳过后面的步骤返回
if x == 0:
return True
if x < 0:
return False
if x%10 == 0:
return False
reversedData = 0
# 比如12321和123321两种情况
while x > reversedData:
reversedData = reversedData * 10 + x%10
x //= 10
return x == reversedData or x == reversedData//10
正则表达式匹配
链接:题目链接
题目描述
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
‘.’ 匹配任意单个字符
‘*’ 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。
说明:
s 可能为空,且只包含从 a-z 的小写字母。
p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。
解题思路–动态规划,hard题
这题我也不太会,看了大佬的题解才弄懂了,我太菜了
- 如果 p.charAt(j) == s.charAt(i) : dp[i][j] = dp[i-1][j-1];
- 如果 p.charAt(j) == ‘.’ : dp[i][j] = dp[i-1][j-1];
- 如果 p.charAt(j) == ‘*’:
- 如果 p.charAt(j-1) != s.charAt(i) : dp[i][j] = dp[i][j-2] //in this
case, a* only counts as empty - 如果 p.charAt(i-1) == s.charAt(i) or p.charAt(i-1) == ‘.’:
- dp[i][j] = dp[i-1][j] //in this case, a* counts as multiple a
or dp[i][j] = dp[i][j-1] // in this case, a* counts as single a
or dp[i][j] = dp[i][j-2] // in this case, a* counts as empty
- 如果 p.charAt(j-1) != s.charAt(i) : dp[i][j] = dp[i][j-2] //in this
代码实现
class Solution:
def isMatch(self, s: str, p: str) -> bool:
m,n = len(s),len(p)
def matches(i,j):
if i == 0:
return False
if p[j-1] == '.':
return True
return s[i-1] == p[j-1]
f = [[False for _ in range(n+1)] for _ in range(m+1)]
f[0][0] = True
for i in range(m+1):
for j in range(1,n+1):
if p[j-1] == '*':
f[i][j] |= f[i][j-2]
if matches(i,j-1):
f[i][j] |= f[i-1][j]
else:
if matches(i,j):
f[i][j] |= f[i-1][j-1]
return f[m][n]
插两个笔试,小米笔试和携程笔试
小米笔试软件开发岗—选择题和代码题(2题)
小米的代码题比较简单:一个是普通的逻辑题吧,第二个是lc原题,剑指offer的在矩阵中找单词,用回溯递归就行了,过两天就来面试通知了