LeetCode刷题 2019.9.5

第27题 移除元素
LeetCode刷题 2019.9.5_第1张图片
这道题与昨天的最后一题有点类似,但是更加简单,只需pop(i)即可

class Solution:
    def removeElement(self, nums: List[int], val: int) -> int:
        for i in range(len(nums)-1,-1,-1):
            if nums[i] == val:
                nums.pop(i)
        return len(nums)

第28题 搜索插入位置
LeetCode刷题 2019.9.5_第2张图片
数组中获得索引可以用nums.index(i),不存在可以插入排序再获得索引

class Solution:
    def searchInsert(self, nums: List[int], target: int) -> int:
        if target in nums:
            return nums.index(target)
        else:
            nums.append(target)
            nums.sort()
            return nums.index(target)

第53题 求最大子序和
LeetCode刷题 2019.9.5_第3张图片

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        for i in range(1, len(nums)):
            nums[i]=nums[i] + max(nums[i-1],0)
        return max(nums)

第58题 最后一个单词的长度
LeetCode刷题 2019.9.5_第4张图片
判断字符串最后一个字符是否为空,从后往前计数,还有若是字符串为空得首先return 0

class Solution:
    def lengthOfLastWord(self, s: str) -> int:
        k=0
        if len(s) == 0:
            return 0            
        num = len(s)-1
        while s[num] == ' ' and num >= 0:
            num -=1
        while s[num] != ' ' and num >= 0:
            num -=1
            k +=1
        return k

第66题 加一
LeetCode刷题 2019.9.5_第5张图片
其实就是让数组最后一位数加1,主要是处理9这个特殊元素,需要进1。

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        k = 0
        for i in range(len(digits)-1,-1,-1):
            if digits[i] + 1 < 10:
                digits[i] = digits[i]+1
                k=0
                break
            else:
                digits[i]=0
                k=1
        if k == 1:
            digits.insert(0,1)
        return digits

第67题 二进制求和
LeetCode刷题 2019.9.5_第6张图片
有两个解法,第一种用python中先转化为十进制加法,然后将结果转化为二进制即可:

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        a, b = int(a,2), int(b,2)
        c = bin(a+b)
        c = c[2:]
        return c

第二种则是先将两个字符串化为同等长度的,再进行对位相加,每次对应字符与进位符相加。

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        r, k = '', 0
        d = len(a)-len(b)
        a = '0'*-d+a
        b = '0'*d+b
        for i, j in zip(a[::-1], b[::-1]):
            s = int(i)+int(j)+k
            r = str(s%2)+r
            k=s//2
        return '1' + r if k else r

第69题 求x的平方根
LeetCode刷题 2019.9.5_第7张图片
利用牛顿法求解平方根,当然还有更简单的方法,x**0.5

class Solution:
    def mySqrt(self, x: int) -> int:
        x0 = float(x)
        while (x0*x0 > x):
            x0 = (x0 + x/x0)//2
        return int(x0)

第70题 爬楼梯
LeetCode刷题 2019.9.5_第8张图片
终于!终于!终于!有一道我自己会做的了,这个就是斐波那契数列,根据每次的特点去写这个数列就行。

class Solution:
    def climbStairs(self, n: int) -> int:
        a=2
        b=3
        s=0
        if n <=3:
            return n
        else:
            for i in range(n-3):
                s = a+b
                a=b
                b=s
            return s

第83题 合并两个有序数组
LeetCode刷题 2019.9.5_第9张图片
有两种方法,一种用python内置sort函数:

nums1[] = sorted(nums1[:m]+nums2)

另一种方法是用比较法:

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        p1=m-1
        p2=n-1
        p=m+n-1
        nums1_copy= nums1[:m]
        while p1 >=0 and p2>=0:
            if nums1[p1] < nums2[p2]:
                nums1[p]=nums2[p2]
                p2 -=1
            else:
                nums1[p]=nums1[p1]
                p1 -=1
            p -=1
        nums1[:p2+1]=nums2[:p2+1]

第100题 相同的树
LeetCode刷题 2019.9.5_第10张图片
有两种方法,一种的递归的方式:

class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        if not p and not q:
            return True
        if not p or not q:
            return False
        if p.val != q.val:
            return False
        return self.isSameTree(p.right, q.right) and self.isSameTree(p.left, q.left)

另一种为迭代的方式:

class Solution:
    def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:
        def check(p,q):
            if not p and not q:
                return True
            if not q or not p:
                return False
            if p.val != q.val:
                return False
            return True
        
        deq = deque([(p,q),])
        while deq:
            p, q = deq.popleft()
            if not check(p,q):
                return False
            if p:
                deq.append((p.left, q.left))
                deq.append((p.right, q.right))
                
        return True

第101 对称二叉树
LeetCode刷题 2019.9.5_第11张图片
和上一题很像:

class Solution:
    def isSymmetric(self, root: TreeNode) -> bool:
        def v_equal(p,q):
            if not p and not q: return True
            if not p or not q: return False
            return p.val == q.val and v_equal(p.right, q.left) and v_equal(p.left, q.right)
        return v_equal(root, root)

今天刷的还不错,明天加油哦!

你可能感兴趣的:(LeetCode)