菜狗一枚,几乎从零开始用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())))
真正的考点:双指针