leetcode 0208

✅ 108. 将有序数组转换为二叉搜索树

https://leetcode-cn.com/problems/convert-sorted-array-to-binary-search-tree/

描述

中序遍历的逆过程

解答

py

错在: Python没有三目运算符(?😃,类函数不可调用

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        return nums == null ? null : buildTree(nums, 0, nums.len)#tt Python没有三目运算符(?:)
    #tt 而且py 自己定义的函数,也不是 像java 那里可以调用同 类 中的函数
    def buildTree(nums: List[int], l: int, r: int) -> TreeNode:
        if(l > r):
            return null;
        m = l + (r - l) / 2
        root = nums[m]
        root.left = buildTree(nums, l, m - 1)
        root.right = buildTree(nums, m + 1, r)
        return root


fix:

class Solution:
    def sortedArrayToBST(self, nums: List[int]) -> TreeNode:
        if not nums: # 注意要使用if not ,而不是 if nums == None
            return None
        else:
            mid = len(nums) // 2;
            tn = TreeNode(nums[mid])
            nums1 = nums[0:mid]
            nums2 = nums[mid+1: len(nums)]
            tn.left = self.sortedArrayToBST(nums1)
            tn.right = self.sortedArrayToBST(nums2)
        return tn

'''执行用时 :
100 ms
, 在所有 Python3 提交中击败了
16.13%
的用户
内存消耗 :
15.4 MB
, 在所有 Python3 提交中击败了
49.31%
的用户'''

【tdo rev 0208】py知识:if not x:if x is not None:if not x is None:使用

https://blog.csdn.net/sasoritattoo/article/details/12451359

代码中经常会有变量是否为None的判断,有三种主要的写法:

第一种是if x is None

第二种是 if not x:

第三种是if not x is None(这句这样理解更清晰if not (x is None)) 。

如果你觉得这样写没啥区别,那么你可就要小心了,这里面有一个坑。先来看一下代码:


>>> x = 1
>>> not x
False
>>> x = [1]
>>> not x
False
>>> x = 0
>>> not x
True
>>> x = [0]         # You don't want to fall in this one.
>>> not x
False

在python中 None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()都相当于False ,即:

not None == not False == not '' == not 0 == not [] == not {} == not ()

因此在使用列表的时候,如果你想区分x[]和xNone两种情况的话, 此时if not x:将会出现问题:

>>> x = []
>>> y = None
>>> 
>>> x is None
False
>>> y is None
True
>>> 
>>> 
>>> not x
True
>>> not y
True
>>> 
>>> 
>>> not x is None
>>> True
>>> not y is None
False
>>> 

也许你是想判断x是否为None,但是却把x==[]的情况也判断进来了,此种情况下将无法区分。
对于习惯于使用if not x这种写法的pythoner,必须清楚x等于None,  False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行。

而对于if x is not Noneif not x is None写法,很明显前者更清晰,而后者有可能使读者误解为if (not x) is None,因此推荐前者,同时这也是谷歌推荐的风格

结论:

if x is not None是最好的写法,清晰,不会出现错误,以后坚持使用这种写法。

使用if not x这种写法的前提是:必须清楚x等于None,  False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行。


✅ 344. 反转字符串

https://leetcode-cn.com/problems/reverse-string

描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:

输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

解答

以下的 range() 这些函数 真的就是肌肉写的,无脑记忆写的,猜的。

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        for i in range(len(s) // 2):
            c = s[i]
            s[i] = s[len(s) - 1 - i]
            s[len(s) - 1 - i] = c

其实,幸亏 range 函数是 右边 开的:

>>>range(10)        # 从 0 开始到 10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

所以,当len(s) == 4, we have len(s) // 2 == 2, but using range(2) will result: [0, 1], notice there has no 2, so it's safe, cause we dont swap s[2] and s[1] (after we swapped s[1] with s[2]

✅ 944. 删列造序

https://leetcode-cn.com/problems/delete-columns-to-make-sorted

描述

看不懂题目的可以参考一下这句话:这道题本质就是判断一个矩阵里,有多少列是降序排序的

解答

我的理解是,找到所有不 合适 的列,每找到 一个,就 cnt++

所以 重点是,如何在 矩阵中 的列 进行遍历

when you use py: using zip

class Solution:
    def minDeletionSize(self, A: List[str]) -> int:
        ret = 0
        for i in zip(*A):#success, use: zip(A) will fail, so what is * means for a list???
            if list(i) != sorted(i):
                ret += 1
        return ret

'''执行用时 :
92 ms
, 在所有 Python3 提交中击败了
94.28%
的用户
内存消耗 :
13.7 MB
, 在所有 Python3 提交中击败了
50.69%
的用户'''

python zip

描述:

zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。

如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 *号操作符,可以将元组解压为列表。

zip 方法在 Python 2 和 Python 3 中的不同:在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。

eg in py2:
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 打包为元组的列表
[(1, 4), (2, 5), (3, 6)]
>>> zip(a,c)              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> zip(*zipped)          # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式
[(1, 2, 3), (4, 5, 6)]
eg in py3
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b)     # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped)  # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c))              # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
 
>>> a1, a2 = zip(*zip(a,b))          # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
>>>

when u use c: dive deep into 2d array

int minDeletionSize(char** A, int ASize) {
    int count = 0;
    for(int i = 0;i < strlen(A[0]);i++){
        for(int j = 0;j < ASize - 1;j++){
            if(A[j][i] > A[j+1][i]){
                count++;
                break;
            }
        }
    }
    return count;
}

'''---

my '''

int minDeletionSize(char ** A, int ASize){
    int cnt = 0;
    int i = 0;
    int j = 0;
    int colNum = 0;
    colNum = strlen(A[0]);
    printf("colNum is %d", colNum);
    for(; i < colNum; i++){
        for(j = 0; j < ASize - 1; j++){
            if(A[j][i] > A[j + 1][i]){
                cnt++;
                break;// only break inner for-loop
            }
        }
    }
    return cnt;
}

/*执行用时 :
32 ms
, 在所有 C 提交中击败了
26.53%
的用户
内存消耗 :
9.3 MB
, 在所有 C 提交中击败了
57.43%
的用户*/

✅ 181. 超过经理收入的员工

https://leetcode-cn.com/problems/employees-earning-more-than-their-managers

描述

Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。

+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+
给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。

+----------+
| Employee |
+----------+
| Joe      |
+----------+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/employees-earning-more-than-their-managers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解答

select e1.Name as Employee from Employee as e1 ,Employee as e2 where e1.ManagerId=e2.Id AND e1.Salary>e2.Salary

”和自己的xxx比”这种问题基本都是自连接问题。

SELECT E1.Name AS Employee FROM Employee as E1,Employee as E2
WHERE E1.ManagerId=E2.Id AND E1.Salary>E2.Salary;

疑问是: E1,Employee as E2 这里, select xxx from Table, WTF clause here

solve with 最后的官方解释 tt6

实际上是:

select E1.Name as Employee(tt: the final result employee's name)
from (tt7)
    Employee as E1,
    Employee as E2
where
    E1.ManagerId = E2.Id(tt: 其实在这里,上面的tt7 已经搞出来了一个临时表
                            ,那么这个临时表里就有E1,E2,我们在where and
                            语句里直接用 E1, E2 对其进行筛选即可,留下的E1
                            我们就打印出来了E1.name, 而E2 没干啥而已。)
and
    E1.Salary > E2.Salary;


sql 的 as

as 后面跟着的 是一个别名


正常来说,想查询该表,那么sql语句如下

select * from user

给别人看,自然是需要很多的时间来理解和熟悉,那么as的作用就提现出来了

select
     username as 账号 ,
     password as 密码,
     mingzi as 名字,
    zhengjianhao as 证件号,
    dianhua as 电话,
    zhuceriqi as 注册日期,
    zhuangtai as 状态,
    quanxian as 权限,
    shengyutianshu as 剩余天数
     from user

as 后面跟着的 是一个别名

【todo 理解 sql as 0208】


# Write your MySQL query statement below
SELECT 
    Name Employee # wtf  Employee 可是 表名啊!!!
FROM
    Employee AS a
WHERE
    Salary > (SELECT 
            Salary
        FROM
            Employee
        WHERE
            Id = a.Managerid)

我认为, 这个官方的答案 令人满意 清晰了:

tt6

https://leetcode-cn.com/problems/employees-earning-more-than-their-managers/solution/chao-guo-jing-li-shou-ru-de-yuan-gong-by-leetcode/


SELECT
    *
FROM
    Employee AS a,
    Employee AS b
WHERE
    a.ManagerId = b.Id
        AND a.Salary > b.Salary
;



---imp:(cause we only need `name`)


SELECT
    a.Name AS 'Employee'
FROM
    Employee AS a,
    Employee AS b
WHERE
    a.ManagerId = b.Id
        AND a.Salary > b.Salary
;

posted on 2020-02-08 12:36  Paulkg12  阅读(618)  评论(0编辑  收藏  举报

导航