Jan 232021
 

陪儿子学Python,现在提前熟练一下VSCode,这样日后可以应付儿子的各种问题。

对于VSCode要用的方便,还是有不少地方需要设置。

Extension

整理一下必须用到的扩展,安装过程倒是简单。

Python

这是微软出品的python插件,

python

Python Indent

自动纠正你代码的缩进的各种错误,实用

indent

runner

分段运行代码,写代码是必须的。

runner

Linter

这个是用来发现代码的错误,

https://code.visualstudio.com/docs/python/linting

linter

flake8

两个选一个来安装就可以。好像我不太喜欢,可以选择关闭。

字体

发现字体太小,想通过熟悉的Ctrl + 鼠标滚轮来调整,结果发现不行,搜索一下,网上有教程教如何设置快捷键。不过最最简单的方式,应该就是启用 Zoom的功能

  1. 打开首选项
  2. 进入设置
  3. 搜索zoom.
  4. 滚轮缩放字体选项打上钩
  5. 完成

zoom

方便多了。

terminal on the right

现在显示器都是宽屏,那么代码的终端输出,应该在右边比较合理。

right

效果如下

Auto Save 自动保存

目前你只需要在 设置里启动自动保存的功能,这样运行代码前就不需要保存一下就可以。

auto-save

这个功能启用,是需要你有github账号。

Jan 142021
 

链表,这个我也是第一次碰到,知道他和列表的区别。就借助这个练习来了解。

https://leetcode.com/problems/merge-two-sorted-lists/

代码不复杂

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:


        if l1 is None:
            return l2
        if l2 is None:
            return l1
        if l1.val < l2.val:
            l1.next = self.mergeTwoLists(l1.next, l2)
            return l1
        else:
            l2.next = self.mergeTwoLists(l1, l2.next)
            return l2

慢慢再理解。

Jan 132021
 

这道题是判断输入的符号是否合法。

https://leetcode.com/problems/valid-parentheses/

这道题涉及到所谓栈,stack,所谓的后进先出。这个需要理解一下。

class Solution:
    def isValid(self, s: str) -> bool:
        stack = []
        dic={'(':')','[':']','{':'}'}

        for i in s:
            if i in dic:
                stack.append(i)
            elif len (stack)== 0 or dic[stack.pop()]!=i:
                return False

        return len(stack)==0

代码理解

  1. 建立一个字典
  2. 建立一个空的栈,stack
  3. for循环,如果在字典里,例如左括号,那么就会放到stack上。
  4. 当 i 遇到右括号,由于不在字典里,就运行 elif  , 如果这个时候 stack是空的话,说明没有左括号。或者stack刚刚进入的值的字典里,不是左括号,value 不等于 右括号。那么就是False
  5. 最后,必须stack为空,才能确认是合法的,例如只有一个左括号。

把左边的符号,都放到stack里,右边的符号,从stack拿出来,去字典把value取出来,如果等,那么就继续运行下去。一直到stack里为空,才能证明是有效。

Jan 132021
 

题目很简单,寻找开头相同的字母,看看最大是多少。

https://leetcode.com/problems/longest-common-prefix/

每次看到这种题目,都有一种想法,如果python,有一个内置函数搞定这种看上去比较普遍的问题,多好。没想到这个问题,就是这种情况。居然有内置的函数,直接搞定。

Input: strs = [“flower”,”flow”,”flight”]
Output: “fl”

https://medium.com/@d_dchris/10-methods-to-solve-the-longest-common-prefix-problem-using-python-leetcode-14-a87bb3eb0f3a

上面的朋友用了10种方法来解答,我最喜欢的,还是最后一种。

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        return os.path.commonprefix(strs)
Jan 122021
 

把罗马数字转换成阿拉伯数字,这个题目让我好好学习了一下罗马数字

https://leetcode.com/problems/roman-to-integer/

class Solution:
    def romanToInt(self, s: str) -> int:
        d = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}
        result = 0
        i = 0
        while i<len(s):
            if s[i:i+2] in d:
                result=result+d[s[i:i+2]]
                i=i+2
                continue
            elif s[i:i+1] in d:
                result=result+d[s[i:i+1]]
                i=i+1
        return result

代码理解

  1. 创建了一个字典,输入相关的罗马的数字的对应阿拉伯数字
  2. 设置result 变量,作为结果的输出
  3. s = “MCMXCIV” 作为例子来理解代码
  4. 第一轮,对字符串取前两位,MC,如果在字典里,那么就把放到result里,因为MC不在字典,所以为False,不会执行下面的代码,直接跳到elif ,那么这时候,就看第一个字母是否在字典里,如果在,那么就把结果加入到result里,这个时候,result就是1000。并且i 变成1
  5. 第二轮,我们取第二,第三位,CM,看看是否在字典里,刚好在,CM是900,那么就放到result里面,现在result就变成1900,i 变成3. continue 导致继续循环,到下面2位
  6. 第三轮,还是2位,XC,也刚好是在字典,90,
  7. 第四轮,最后2位,也是在字典,4.

写的也是非常巧妙。先拿两位到字典查询,如果没有,再拿一位取查询。

Jan 122021
 

估计没几个人能认识这样的单词。意思倒是不复杂,

https://leetcode.com/problems/palindrome-number/

就是把一个数字,反转过来,数值和原来相对的数字。例如,121,你反转后,还是121

题目专门提到不能使用字符串的方式来解答这个问题,那么就只能老实点。

class Solution:
    def isPalindrome(self, x: int) -> bool:
        num=0
        a=abs(x)

        while a!=0 :
            temp=a%10
            num=num*10+temp
            a=int(a/10)

        if x >= 0 and x == num:
            return True
        else:
            return False

代码理解

  1. 把x取 绝对值
  2. 设置num 变量,他是0
  3. 目标就是a会逐步变成0,而num是逐步变成反转数字
  4. 使用一个临时变量temp,取得当前数字的第一位
  5. 把第一位的数字放到num上,并且把这个数字乘10,左移动一位。
  6. 通过对a的整数,拿掉第一位的数字
  7. 后续就是十位相同的操作。
  8. 一直到a变成0,while 停止
  9. 负数都不能满足这个条件