Leetcode 2020年4月 Code challenge - Week 1

因为受疫情影响,我不得不宅在家。刚好利用这个机会刷刷题。因为不想继续做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)

你可能感兴趣的:(Leetcode 2020年4月 Code challenge - Week 1)