最近终于开始刷leetcode了,用这篇文章记录一下自己刷题过程踩过的坑。有的是一些知识盲点,也有一些编译或语法上的小问题
目录
100. 相同的树
初始代码如下
if p == None and q == None:
return True
else:
if p.val == q.val:
return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
else:
return False
然后报错显示None type没有 val变量。
主要的问题为没有把子节点为None的各种判断情况考虑清楚
修正后的代码如下
def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
if not p and not q:
return True
elif p and not q:
return False
elif q and not p:
return False
else:
if p.val == q.val:
return self.isSameTree(p.left, q.left) and self.isSameTree(p.right, q.right)
else:
return False
177. 第N高的薪水
- 此题最关键的知识点在于LIMIT后面可以有两个参数,第一个参数为开始的Index,第二个参数为选取的数据量。例如LIMIT N-1, 1 即表示第N条数据
IFNULL(expr1, expr2)
如果expr1为空则返回expr2
178. 分数排名
- 一开始我语法正确但是反复报错,后经排查发现题目不让直接用Rank作为字段名,于上`Rank`通过,字段名最好加上反引号
- 三个排序窗口函数的区别
对于成绩[4, 4, 3, 2, 1]
dense_rank()
的排名是1,1,2,3,4
rank()
的排名是1,1,3,4,5
row_number()
是1,2,3,4,5
196. 删除重复的电子邮箱
这道题一开始想复杂了,没做出来,在一个表中比较相同字段的大 小是常用的取最大 或最小值的方法,掌握的并不好。
197. 上升的温度
这道题考查三个计算日期的窗口函数:
DATEDIFF(date1, date2)
返回两个日期的差值 前减后
TO_DAYS(date)
返回一个天数 是从0开始计算到date的天数
DATE_SUB(date, day)
返回用date减去day后的日期
262. 行程和用户
这个题踩了两个坑,开始时我的代码如下:
SELECT
`Request_at` AS `Day`,
FORMAT(COUNT(IF(Status <> 'completed', 1, Null))/Count(1), 2) AS `Cancellation Rate`
FROM Trips
WHERE (Client_Id, Driver_Id) NOT IN (
SELECT Users_Id, Users_Id
FROM Users
WHERE Banned='Yes'
) AND `Request_at` BETWEEN '2013-10-01' AND '2013-10-03'
GROUP BY Request_at
然后出现了两个问题
-
一开始时的答案总是不对,后来排查发现是这个部分的问题
(Client_Id, Driver_Id) NOT IN ( SELECT Users_Id, Users_Id FROM Users WHERE Banned='Yes' )
当WHERE IN 中出现多个字段时,是按照原表中一行一行查找的,并不会对每一个字段单独判断,所以自查询部分的结果是两个User_Id的内容相同。昨天在网上看到这个神奇的语法,看来还是要慎用。
-
开始时使用
FORMAT()
函数,但是这个函数是无论原来多少位都会固定保留两位小数,于题目答案不一样,所以改成了ROUND()
。在这里总结了一下几个格式化小数的函数
MySQL 小数格式化
-
FORMAT(x, d)
FORMAT()
函数会对小数部分进行四舍五入操作,整数部分从右向左每3位一个逗号进行格式化输出FORMAT(123456.789, 2); 123,456.79 FORMAT(123456, 2); 123,456.00 FORMAT(0.1, 2); 0.10 FORMAT(0.001, 2); 0.00
-
ROUND(x, d)
ROUND(123456.789, 2); 123456.79 ROUND(123456, 2); 123456 ROUND(0.1, 2); 0.10 ROUND(0.001, 2); 0.00
-
TRUNCATE(x, d)
TRUNCATE(123456.789, 2); 123456.78 TRUNCATE(123456, 2); 123456 TRUNCATE(0.1, 2); 0.10 TRUNCATE(0.001, 2); 0.00
-
CONVERT(expr, type)
CONVERT()
函数会对小数部分进行四舍五入操作,第一个参数是转换的数据,第二个参数是自定义的目标数据类型
DECIMAL(10, 2)
表示最终得到的结果整数部分位数加上小数部分位数小于等于10,小数部分位数为2。SELECT CONVERT(123456.789, DECIMAL(10, 2)); 123456.79 SELECT CONVERT(123456, DECIMAL(10, 2)); 123456.00 SELECT CONVERT(0.1, DECIMAL(10, 2)); 0.10 SELECT CONVERT(0.001, DECIMAL(10, 2)); 0.00