参加本次打卡活动主要有两个目标,首先是复习算法,督促自己刷题。其次是学习python。以前都是c++做题,平时很少写python。之前学过一点点语法,由于缺乏运用,基本上忘光了,正好趁这次打卡活动学一下python吧。算法复杂度分析的部分在做题的过程中去进行。重新翻了翻《python基础教程(第3版)》快速的复习了一下python最最基础的一些语法,开始刷题。
在leetcode上面选择了python3,看到defgetConcatenation(self, nums: List[int]) -> List[int]: 这样的语法有点懵。这是js进化成TS的节奏啊?查了一下是python3的新特性:”类型注释“。仅仅是个注释,对类型检查毫无用处,吓了一跳……

体会:一边看书学语法,一边刷题效率还是有点慢。应该抽出整块时间,数小时完整的过一过python语法再继续刷题吧~

作业打卡:

经典的空间换时间思想。利用hash查询时间复杂度近似O(1)的特点,优化O(n)数组查询操作。额外需要O(n)空间复杂度来存dict。

  1. class Solution:
  2. def twoSum(self, nums: List[int], target: int) -> List[int]:
  3. dic = {}
  4. for i, num in enumerate(nums):
  5. if target - num in dic:
  6. return [dic[target - num], i]
  7. else:
  8. dic[num] = i
  9. return []

太简单了,没什么好说的……一道语法题,帮助熟悉不同编程语言的数组声明、赋值操作。
学习了python中list的extend的用法。
a.extend()方法将原list后面附加多个值,并返回修改后的a。
使用+号也可以链接两个list,但是a+b并不会改变原先的list a,而是返回一个全新的list。而且会把ab各复制一份,效率比extend低。

class Solution:
    def getConcatenation(self, nums: List[int]) -> List[int]:
        nums.extend(nums)
        return nums

暴力双重循环时间复杂度O(nm),用hash优化O(n+m),看了题解,完全不知道set怎么用,先学一下python再来看看吧。

class Solution:
    def numJewelsInStones(self, jewels: str, stones: str) -> int:
        dic = {}
        for c in jewels:
            dic[c] = 0
        for c in stones:
            if c in dic:
                dic[c] += 1
        return sum(dic.values())