记录2024用Python刷leetcode100的艰难心路历程🥹

69 阅读3分钟

菜狗一枚,几乎从零开始用python刷题,平常用python挺多的,不过一般都是GPT写代码,所以自己写甚至连备注符号和加不加冒号都想不起来,开帖记录一下

2.26 :两数之和

我的思路:两层循环,第一层遍历数组选元素,第二层在未遍历的数组部分找目标和第一个元素的差,找到就返回下标

  • if后面要加冒号
  • for循环自动迭代i++
  • python没有++运算符
  • 用#写备注,for j in range(i+1,len(nums)):# 就可以从i+1开始

降低复杂度到O(n)

用哈希表(字典)存储遍历过的元素及其索引

        store_num={}
        for i in range(len(nums)):
            if target-nums[i] in store_num:
                return [store_num[target-nums[i]],i]
            store_num[nums[i]]=i
  • 字典是{},字典没有push,append方法,添加元素直接用my_dict["new_key"] = "new_value",很方便
  • if还可以用in,if complement in num_map:这一句复杂度是O(1)

2.28:字母异位词分组

我的思路:遍历字符串数组,每遇到一个第一次出现的字母组合,就存入一个新数组中,第二次出现的字母组合存入已有组合的数组中。每个组合的内部升序排序一下,最后按字母组合的长度升序输出

  • sorted和sort,真的很折磨sorted(数组/字典,参数)可以让它们排序,数组.sort()可以原地排序
  • 按我的思路写出来的代码会超时
class Solution(object):
    def groupAnagrams(self, strs):

        final=[]
        if len(strs)==0 or len(strs)==1:
            final.append(strs)
            return final
        for s in strs:
            sorted_s = ''.join(sorted(s))
            matched = False
            for group in final:
                if sorted_s == ''.join(sorted(group[0])):
                    group.append(s)
                    matched = True
                    break

            if matched == False:
                final.append([s])
        for group in final:
            group.sort()

        return sorted(final,key=len)
  • 超时解决:hash(字典),不用数组用字典,字典自动检查值,也不需要排序,注意字典添加元素就直接加就好。In python,字典{}=hash,数组[]=列表list
        final={} #从数组变成字典啦!!
        for s in strs:
            sorted_s = ''.join(sorted(s))
            if sorted_s in final:
                final[sorted_s].append(s) #给value(list)直接加入元素
            else:
                final[sorted_s]=[s] #给字典加入key-value对,value赋值是数组[s]
                
        for i in final:
            final[i].sort()

3.14 移动零

时隔15天,天呐时间也太快了吧,瞎忙15天了

我的思路:看见零就删除,最后加上对应个数的零

        ele=[0]
        old_len=len(nums)
        nums[:]=[x for x in nums if x not in ele]
        new_len=len(nums)
        nums.extend([0]*(old_len-new_len))
  • 面向GPT编程,学到了python列表的很多方法:
    • 删除元素:remove(ele)删除匹配ele的第一个元素,pop(index)删除对应下标的元素
    • 要一次性在数组末尾增加多个元素,可以使用extend(array)
  • 列表推导式,之前没写过,很优雅,提供了一种简洁的方法来创建新的列表,可以根据现有的列表进行筛选、转换或过滤
arr = [1, 2, 3, 4, 5, 3, 6, 3] 
to_remove = [3] # 要删除的元素列表 
arr = [x for x in arr if x not in to_remove] 
print(arr) # 输出: [1, 2, 4, 5, 6]


original_list = [1, 2, 3, 4, 5]
# 使用列表推导式创建新的列表
squared_list = [x**2 for x in original_list]
print(squared_list)  # 输出: [1, 4, 9, 16, 25]
  • 注意⚠️:这个方法一定要对数组进行切片。
    • nums[:] 这种切片操作可以在不复制数组的情况下原地对数组进行操作。在 Python 中,使用切片操作可以创建原始数组的视图,而不会创建新的数组副本。直接使用 nums 列表无法实现题目要求的“in-place”修改,是因为在 Python 中,变量名(如 nums)实际上是指向对象的引用。当你对 nums 进行赋值操作时,实际上是改变了这个引用指向的对象,而不是修改对象本身。
    • 但是因为创建了切片,所以空间复杂度还是O(n)???GPT说的
  • ACWing python输入方法
for line in sys.stdin:
    print(sum(map(int, line.split())))

真正的考点:双指针