自我监督刷题记录处1
第一篇日记,用于记录刷题的每天进程,因为怕自己又坚持不下去,所以让大家监督。每天3道题,希望能坚持下去。作为95后女程序媛👩💻,经验不多,算法不好,所以一直逃避刷题,但年龄到了还是要面对的😭…有经验的大神们如果有更好的解法希望指导下!感恩感恩!❤
Leetcode 1 TwoSum
(Easy Level)
class Solution:
def twoSum(self,nums,target):
#创建空字典
dic = {}
#从nums中取index,value
for num1,i in enumerate(nums):
#获取目标值
num2 = target - num1
#查看目标值是否被保存在新建的字典里
if num2 in dic:
#有的话返回两个index
return [dic[num2], i]
#没有的话将num1和它的index存入字典中,以便下次循环时能查看是否在字典中。
dic[num1] = i
- 运用python 的字典(hashmap),先存后查实现,作为第一题真的很经典。
Leetcode 2 Add Two Numbers
(Medium Level)
class solution:
def addTwoNumbers(self,l1:ListNode,l2:ListNode):
'''
sum:每位数相加的总和加进位(如果前一位有进位,需在后一位计算时加上
carry: 进位计数器
dummy & tail:dummy的链表头和链表尾
'''
sum = 0
carry = 0
dummy = tail = ListNode(0)
#这里我写全了,也可以写成while l1 or l2 or carry,判定是否循环
while l1 != None or l2 != None or carry != 0:
#计算每个位的两数字之和,carry是进位计数
sum = (l1.val if l1 else 0) + (l2.val id l2 else 0) + carry
#给tail.next赋值,因为只取sum的各位,所以用取余
tail.next = ListNode(sum % 10)
#tail进行重新指向
tail = tail.next
#计算要进几位
carry = sum // 10
#分别判断l1,l2是否为空后,重新移动指针赋值
if (l1 != None):l1 = l1.next
if (l2 != None):l2 = l2.next
#因为是逆序输出所以用dummy.next做链表头返回链表
return dummy.next
*主要考察链表,python没有链表的数据类型,如果不在leetcode上写的时候不要忘记定义node类~
Leetcode 3 Add Two Numbers==(Medium Level)
(Medium Level)
class solution:
def lengthOfLongestSubstring(s: str) -> int:
'''
cur_length是窗户长
max_length是用于存储最大值的
pointer是指向不重复就不移动的str
list用来存全部不同的
'''
cur_length = 0
max_length = 0
pointer = 0
lists = []
#第一步先把极端情况排除
if s is None:return 0
#i指针不断向尾部移动
for i in range (len(s)):
#如进入循环,则必然有一个元素
cur_length +=1
#check i指针所指的元素是否在lists中
while s[i] in lists:
#pointer所指元素与i所指相同,so,去重元素
lists.remove(s[pointer])
#pointer向前移动一位
pointer +=1
#目前长度减一
cur_length -= 1
#如不在lists中则加入i所指元素
lists.append(s[i])
#对比现长度和max_length的长度,同时也可能对max_length赋值
if cur_length > max_length:max_length = cur_length
#返回最长,打完收工....
return max_length
*这题很明显用sliding window来做,我本来想用enumerate来取index,因为我本人用zip和enumerate不太好,但最后还是选择直接遍历的方法…整体思路很容易想,但长度计算过程中,请记住可能要出现cur_length+1 - max_length的情况。写了几种做法,其他的都太慢超时了😭,什么时候能不这么菜。
- 完成任务