因为受疫情影响,我不得不宅在家。刚好利用这个机会刷刷题。因为不想继续做Java developer,而且对Data Science有很大兴趣,趁机也直接当做学习Python,用Python来刷题。没想到真是比Java效率高多了,简直后悔早几年的时候为什么不早学Python。给我懊悔30秒……
直接说这个4月的code challenge。现在还没做完,但感觉上基本都是easy-medium难度。题型广度似乎还可以,不过还是要在之后多练习同类题目来加深印象。
用Python的一个好处是有Jupyter notebook这样的工具,我可以很容易把代码整合在一起,而不必像Java一样要打开笨重的IntelliJ去建立一个个Project。这样的好处是复用性高很多。我的IntelliJ Java 代码跨度3-4年,以前做过的代码都不知道放哪里,而且IntelliJ的工程文件夹里面太多没用的文件,不利于查找。另外Jupyter notebook的文档功能和代码结合度高,而且好用显眼,Java的注释我往往写了也就忘掉。
好了,这里直接先上题目,这里先只提Week 1的题目。之后在下几篇中讲Week 2,3,4,5。
Single Number
也是 Q.136题
算是简单题,用list的操作就能解决
class Solution:
def singleNumber(self, nums: List[int]) -> int:
res = []
for num in nums:
if num not in res:
res.append(num)
else:
res.remove(num)
return res[0]
Happy Number
也是202题
这题我用了如下操作技巧:
- 把int数字转化成list
- 用list comphrehension来快速求各个位的数平方之和,12+92
- 根据,各个位的平方之和会出现两种情况,要么位1,要么无限循环下去。所以用一个set来存放结果,用来判断是否出现了循环。
class Solution:
def isHappy(self, n: int) -> bool:
mem = set()
while n != 1:
n = sum([int(i) ** 2 for i in str(n)])
if n in mem:
return False
else:
mem.add(n)
else:
return True
Maximum Subarray
最大子串之和,经典问题了
这里我用动态规划,找到最优子结构,类似于归纳法,找到
f(n)与f(n-1)的关系。网上有很多比我好的解释。
结尾的reduce(lambda a,b: a if a>b else b, sums)
是用来找出在sums这个list中的最大值
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
sums = [nums[0]]
for index in range(1, len(nums)):
# print(index)
if sums[index-1]+nums[index] > nums[index]:
sums.append(nums[index] + sums[index-1])
else:
sums.append(nums[index])
return reduce(lambda a,b: a if a>b else b, sums)
Move Zeroes
Leetcode 283题
由于要求用in-place方法(也就是原地置换,不许用另外一个list来协助),我就想象用气泡法。一遍扫描,遇到0就挤到后面。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
non_zero = -1
index = 0
while index
Counting Elements
好像Problems题库中没有,这里我抄下题目:
Given an integer array arr, count element x such that x + 1 is also in arr.
If there're duplicates in arr, count them seperately.
Examples:
Input: arr = [1,2,3]
Output: 2
Explanation: 1 and 2 are counted cause 2 and 3 are in arr.
Input: arr = [1,1,3,3,5,5,7,7]
Output: 0
Explanation: No numbers are counted, cause there's no 2, 4, 6, or 8 in arr.
Input: arr = [1,3,2,3,5,0]
Output: 3
Explanation: 0, 1 and 2 are counted cause 1, 2 and 3 are in arr.
思路:
简述题目就是要求比较原list与list中各元素加1后的共同元素,可以用交集intersection操作。另外list中各元素加1,可以想象原list是一个向量,加1操作可以想象成加上单位向量[1,1,1,...]。因此,可以用到numpy。
import numpy as np
class Solution:
def countElements(self, arr: List[int]) -> int:
np_arr = np.asarray(arr, dtype=np.int)
np_ones = np.ones(len(arr),dtype=int)
np_ones = np_arr + np_ones
# print(np_ones)
res = np_ones[np.in1d(np_ones, np_arr)]
# print(res)
return len(res)