从今年大概八月中开始,为了磨利自己的技术避免过于安逸就开始了刷题的生活,其中有经历了铁人的自我挑战赛,但由于只有30天,当初就只有写30天。
为什么到了今天又突然要继续呢?大概是因为无聊吧+纪录写过的题目。
基本上每天大概会写四道题目两题medium + 两题easy,不好意思再度打扰各位啦~
除此之外,我也会开直播固定录影纪录,若有同好欢迎一同加入,要不然真的有点无聊XD
有任何指教或觉得我写得不好的地方可以提出来唷,我认为练习的过程是需要批评的,特别是程式码的部分
以下再次附上为什么我会这样做的原因吧。
学而不思则罔,思而不学则殆。
我曾经是一位软体工程师,但由于受不了工作环境的烦闷,因此最终脱离了那个地方并迈入了教育的行业。
在这条路上遇到形形色色的学生,有极为附有天赋的学生,也有资质较为愚钝的,但无论遇到的是谁对我而言所教授的东西并不会差异太大,这导致了一个现象----我的程式能力没有丝毫进步,甚至退步了。这在现在的社会可不是好现象,不进步跟慢性死亡差不多。
因此,我想对自己开几帖药方:
建置Side Project:设置一个没有做过但自己有兴趣的专案,无论是对学生的谈资,或者是在这过程中学习新知识,更甚者当成未来在求职用的东西都可以。找课程学习并考取证照:个人对资安相关类的东西也负有兴趣,除此之外这似乎也是全球各地都缺少的人才,无论如何都可以有活路走,而且也有相关的证照考试可以证明自己有学会其中的知识,但都有一定的时效性。刷题目:透过题目去进行练习,回忆过往所学过或者所做过的东西,以及思考有没有更快速的解题方法。后来这三帖药方我选择了第三种,为什么呢?
我想主要还是我现在所面对的教学环境吧,一方面学生会想要练习一些与竞程相关的题目,另一方面写题目确实是一个可以知道自己基本功的方式之一。因此我选择了leetcode当成我的起点,个人认为里面的题目与竞程的题目相比较为朴实无华,比较不会有花样在,练习完这些题目后再去刷其他题目或许会比较适合。
当然身为一个教学者,部会单单只是练习题目还必须讲解,因此接下来的几天挑战,除了写上自己的练习题目以外,还会加上自己的见解与说明,尽可能让大家明白里面的内容。
Print Immutable Linked List in Reverse (medium)
https://leetcode.com/problems/print-immutable-linked-list-in-reverse/
Submission: https://leetcode.com/submissions/detail/851278594/
题目提供了一个封闭的class,其资料格式与linkedlist相同,不过他只提供两种API可以做使用,一个是printValue(),可以输出目前node点的value值;一个是getNext(),可以到下一个node点。
最后要反着输出该linkedlist。
# """# This is the ImmutableListNode's API interface.# You should not implement it, or speculate about its implementation.# """# class ImmutableListNode:# def printValue(self) -> None: # print the value of this node.# def getNext(self) -> 'ImmutableListNode': # return the next node.class Solution: def printLinkedListInReverse(self, head: 'ImmutableListNode') -> None: numList = [] while head: numList.insert(0,head) head = head.getNext() while numList: numList.pop(0).printValue() #参考别人的利用递迴解 def printLinkedListInReverse(self, head: 'ImmutableListNode') -> None: if (head.getNext() != None): self.printLinkedListInReverse(head.getNext()) head.printValue()
Number of Arithmetic Triplets (easy)
https://leetcode.com/problems/number-of-arithmetic-triplets/
Submission:https://leetcode.com/submissions/detail/851269535/
他会提供三个索引值 i < j < k,以及一整数diff。找出nums串列里面是否存在 nums[i] + diff == nums[j],nums[j]+diff == 3。
class Solution: #要找出有多少种 i ,j ,k可以达成 nums[j] - nums[i] == nums[k] - nums[j] == diff #长度200以内,基本上就是多重迴圈解,诶不是阿,单层就可以解 #严格递增的话不会有重複的数字 #写到一半想到不用这么麻烦 # def arithmeticTriplets(self, nums: List[int], diff: int) -> int: # numsDic = {} # for i in range(nums): # numsDic[nums[i]] = i # if nums[i] + diff in numsDic and nums[i] + diff*2 in Dic: def arithmeticTriplets(self, nums: List[int], diff: int) -> int: ans = 0 for i in nums: if i + diff in nums and i + 2*diff in nums: ans+=1 return ans
Merge Similar Items (easy)
https://leetcode.com/problems/merge-similar-items/
Submission:https://leetcode.com/submissions/detail/851263281/
给予两串列items1 and items2,items[i] = [value,weight],把value当key统计出所有value的weight为多少。
class Solution: def mergeSimilarItems(self, items1: List[List[int]], items2: List[List[int]]) -> List[List[int]]: recD = defaultdict(int) for i in items1: recD[i[0]] += i[1] for i in items2: recD[i[0]] += i[1] ans = sorted(recD.items()) return ans
Find Players With Zero or One Losses
https://leetcode.com/problems/find-players-with-zero-or-one-losses/
Submission:https://leetcode.com/submissions/detail/851256621/
给一个串列matches,里面含有多个串列,matches[i][0]代表赢的玩家,matches[i][1]代表输的玩家,要统计出没有输过的玩家以及输一场的玩家。
class Solution: #回传一个串列,里面包含两个串列 #第一个是全赢的 #第二个是只输一场的 def findWinners(self, matches: List[List[int]]) -> List[List[int]]: recD = defaultdict(int) for i in matches: recD[i[0]] += 0 recD[i[1]] += 1 ans = [[],[]] for i,v in recD.items(): if v == 1: ans[1].append(i) elif v == 0: ans[0].append(i) ans[1].sort() ans[0].sort() return ans