【Leetcode】一刷踩坑笔记

最近终于开始刷leetcode了,用这篇文章记录一下自己刷题过程踩过的坑。有的是一些知识盲点,也有一些编译或语法上的小问题

目录
  • 100. 相同的树
  • 177. 第N高的薪水
  • 178. 分数排名
  • 196. 删除重复的电子邮箱
  • 197. 上升的温度
  • 262. 行程和用户

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高的薪水
  1. 此题最关键的知识点在于LIMIT后面可以有两个参数,第一个参数为开始的Index,第二个参数为选取的数据量。例如LIMIT N-1, 1 即表示第N条数据
  2. IFNULL(expr1, expr2) 如果expr1为空则返回expr2
178. 分数排名
  1. 一开始我语法正确但是反复报错,后经排查发现题目不让直接用Rank作为字段名,于上`Rank`通过,字段名最好加上反引号
  2. 三个排序窗口函数的区别
    对于成绩[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

然后出现了两个问题

  1. 一开始时的答案总是不对,后来排查发现是这个部分的问题

    (Client_Id, Driver_Id) NOT IN (
      SELECT Users_Id, Users_Id
      FROM Users
      WHERE Banned='Yes'
    )
    

    当WHERE IN 中出现多个字段时,是按照原表中一行一行查找的,并不会对每一个字段单独判断,所以自查询部分的结果是两个User_Id的内容相同。昨天在网上看到这个神奇的语法,看来还是要慎用。

  2. 开始时使用 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
    

你可能感兴趣的:(leetcode,leetcode,python,sql)