LeetCode个人笔记python篇(easy)

1、反转整数

class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        j = 0  
        t = abs(x)
        while int(t) != 0:
            j = j*10+t%10
            t = int(t/10)
        if x < 0:
            j = -j
        if j<-2147483648 or j>2147483647:
            return 0
        return j

    问题1:python不同于C,整数除以10得到的是浮点数,需要转换。问题2:题目问的是反转后的整数溢出则为0,需审题。问题3:Python中最快的解答是将其转换成字符串然后利用切片[::-1]来进行转置。

9、回文数

class Solution:
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        return False if x < 0 else x == int(str(x)[::-1])

        在Python中,is 比较的是两个字符串指针位置是否相同,而 ==则判断字符串是否相同。

14、最长公共前缀

第一种做法:找到最短的字符串,然后遍历,第二种做法,打包成zip

        if not strs:
            return ""
        if len(strs) == 1:
            return strs[0]
        minl = min([len(x) for x in strs])
        end = 0
        while end < minl:
            for i in range(1,len(strs)):
                if strs[i][end]!= strs[i-1][end]:
                    return strs[0][:end]
            end += 1
        return strs[0][:end]
        res = ""
        if len(strs) == 0:
            return ""
        for each in zip(*strs):#zip()函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
            if len(set(each)) == 1:#利用集合创建一个无序不重复元素集
                res += each[0]
            else:
                return res
        return res

19、删除链表的倒数第N个节点

class Solution(object):
    def removeNthFromEnd(self, head, n):
        """
        :type head: ListNode
        :type n: int
        :rtype: ListNode
        """
    res = ListNode(0)
    res.next = head
    l1 = res
    l2 = res
    for i in range(n):
        l1 = l1.next
    while l1.next:
        l1 = l1.next
        l2 = l2.next
    l2.next = l2.next.next
    return res.next

python需要调用ListNode类来完成对链表的操作。其中基本操作如下:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None
 
l1 = ListNode(1)
l2 = ListNode(2)
l3 = ListNode(3)
l4 = ListNode(4)
 
l1.next = l2
l2.next = l3
l3.next = l4
 
print(l1.next.next.next = l4)

21、合并两个有序链表

class Solution:
    def mergeTwoLists(self, l1, l2):
        """
        :type l1: ListNode
        :type l2: ListNode
        :rtype: ListNode
        """
        a = l1
        b = l2
        c = ListNode(0)
        p = c
        while a and b:
            if a.val <= b.val:
                p.next = a
                a = a.next
            else:
                p.next = b
                b = b.next
            p = p.next
        if a:
            p.next = a
        elif b :
            p.next = b
        return c.next

26.数组去重

class Solution:
    def removeDuplicates(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0:
            return 0
        i = 0
        for j in range(len(nums)):
            if nums[i] != nums[j]:
                i +=1
                nums[i] = nums[j]
        return i + 1

一说到去重想到的就是转换成集合set,但是题目要求在原数组上进行更改,集合不清楚是作为一个视图显示还是copy了一个数组

66、加一

class Solution:
    def plusOne(self, digits):
        """
        :type digits: List[int]
        :rtype: List[int]
        """
        l = len(digits)
        i = 0
        digits[l-1] += 1
        if digits[l-1] == 10:
            i = l-2
            while(i >=0):
                digits[i] += 1
                digits[i+1] = 0
                if digits[i] >=10:
                    i -=1
                else:
                    break
        if i == -1:
            digits.insert(0,1)
            digits[1] = 0
        return digits

中心思想就是模拟进位,列表中插入数据的方法是l.insert(i,n),i是插入位置,n是插入数据。看到一个较快方法是把列表中元素*10+i变成一个整数,加一后再写除10求余变成列表。

69、x的平方根

class Solution:
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        l,r = 0,x
        while l<=r:
            mid = l + (r-l)//2
            if mid*mid <= x <(mid+1)*(mid +1):
                return int(mid)
            elif mid*mid >x:
                r = mid
            else:
                l = mid +1

问题1:直接使用i*i

104、二叉树最大深度

class Solution:
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """ 
        if root is None: 
            return 0 
        else: 
            left_height = self.maxDepth(root.left) 
            right_height = self.maxDepth(root.right) 
            return max(left_height, right_height) + 1 

125、验证回文串

class Solution:
    def isPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        s2 = list(filter(str.isalnum,s.lower()))
        s1 = s2[::-1]
        if s1 == s2:
            return True
        else:
            return False

filter,过滤器,接收一个函数和一个序列,如果序列不符合函数,则去掉其中元素。

141、环形链表

class Solution(object):
    def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        fast = slow = head
        while fast and fast.next:
            fast = fast.next.next
            slow = slow.next
            if slow == fast:
                return True
        return False

主要分析如下链接所示:

https://blog.csdn.net/qq_34364995/article/details/80518191

206、反转链表

class Solution:
    def reverseList(self, head):
        """
        :type head: ListNode
        :rtype: ListNode
        """
        if head is None:
            return None
        p=head
        pre=None
        cur = None
        while p:
            cur = p.next
            p.next = pre
            pre = p
            p = cur
        return pre

217、存在重复元素

自己想的是先排序,然后从头遍历,但凡和下一个元素一样就有重复的。网上最快答案是len(nums)>len(set(nums))

237、删除链表中的节点

class Solution:
    def deleteNode(self, node):
        """
        :type node: ListNode
        :rtype: void Do not return anything, modify node in-place instead.
        """
        node.val=node.next.val
        node.next=node.next.next

242、有效的字母异位词

class Solution:
    def isAnagram(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        l1=list(s)
        l2=list(t)
        l1.sort()
        l2.sort()
        if l1==l2:
            return True
        else:
            return False

使用List可以将字符串转换为列表。最快的方式是转换成集合,然后使用s.count()函数挨个判断字符数是否相等。

290、单词模式

class Solution:
    def wordPattern(self, pattern, str):
        """
        :type pattern: str
        :type str: str
        :rtype: bool
        """
        str1 = str.split(" ")
        if len(str1) != len(pattern):
            return False
        return len(set(str1)) == len(set(pattern)) == len(set(zip(str1,pattern)))

这是一个查找是否为完全映射的问题。

387、字符串中的第一个唯一字符

class Solution:
    def firstUniqChar(self, s):
        """
        :type s: str
        :rtype: int
        """
        check = []
        for i in 'abcdefghijklmnopqrstuvwxyz':
            if s.find(i) != -1 and s.find(i) == s.rfind(i):
                check.append(s.find(i))
        return min(check) if len(check) >0 else -1

这是最快的方法,其中rfind的作用是从后往前找第一次出现的位置,即最后一次出现的位置。find是从左边开始找到第一次出现的位置

509. 斐波那契数

第一种方法是递归,第二种方法时间复杂度是O(N)

class Solution(object):
    def fib(self, N):
        """
        :type N: int
        :rtype: int
        """
        if N<2:
            return N
        return self.fib(N-1) + self.fib(N-2)

class Solution(object):
    def fib(self, N):
        """
        :type N: int
        :rtype: int
        """
        if N<2:
            return N
        first = 0
        second = 1
        for i in range(2,N+1):
            third = first + second
            first = second
            second = third
        return third

680、验证回文字符串 Ⅱ

class Solution:
    def validPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        k = s[::-1]
        if k == s:
            return True
        for i in range(len(s)):
            if s[i] != k[i]:
                break
        if i == 0:
            news = s[i+1:]
            news2 = k[i+1:]
        else:
            news = k[:i] + k[i+1:]
            news2 = s[:i] + s[i+1:]
        news3 = news[::-1]
        news4 = news2[::-1]
        if news == news3 or news2 == news4:
            return True
        else:
            return False

首先思路是先反转,如果遇到不一样,就删掉,看剩下的是否能凑成回文。主要遇到问题是不一致字符串是删源字符串还是删反转后的k,再有就是不一致字符出现在首尾的问题。有个问题是看到别人可以直接写成return True if s == s[::-1] else False这种形式,但是我一写就会报错,只能添加很多无用变量。大概好像是因为==的问题?

709、转换成小写字母

class Solution:
    def toLowerCase(self, str):
        """
        :type str: str
        :rtype: str
        """
        return str.lower()

一开始想的是和C语言一样,遍历字符串,然后遇到大写字母就加32,但python会提示字符和数字不能相加,然后直接用了Python自带函数。但奇怪的是所有提交答案都一样,却有执行效率不一样的问题。

884、两句话中的不常见单词

class Solution:
    def uncommonFromSentences(self, A, B):
        """
        :type A: str
        :type B: str
        :rtype: List[str]
        """
        LA = A.split(" ")
        LB = B.split(" ")
        L = []
        for i in LA:
            LC = LA[:]
            LC.remove(i)
            if (i not in LC) and (i not in LB):
                L.append(i)
        for i in LB:
            LD = LB[:]
            LD.remove(i)
            if (i not in LD) and (i not in LA):
                L.append(i)
        return L

这里主要用到了一个函数remove()它可以删除首个符合条件的元素,因此想法是遍历列表LA,把元素提取出来,然后复制列表LC再删除当前元素,如果当前元素还在LC中,则代表此元素出现不止一次,因此选取不在LC也不在LB中的元素即为符合条件。然后对LB进行同样操作。

注意复制列表时要用LC = LA[:],仅用LC = LA会指向同一个地址。使用 a[:], list(a), a*1, copy.copy(a)四种方式复制列表结果都可以得到一个新的列表。

867、转置矩阵

看到一个十分有意思的答案

return map(list, zip(*array))

map是一个映射函数,把后面的每一项用前面的函数转化。list就是将zip(*array)转化成list得到题目要求输出。而zip的用法是

a = [1,2,3],b = [4,5,6] zip(a,b) = [(1,4),(2,5),(3,6)],如果元素个数不一致,则按最短的输出,zip的本意是减少内存。而zip(*)是zip的逆操作,a = [[1,4],[2,5],[3,6]],zip(*a) = [(1,2,3)(4,5,6)]得到的是元组,需要转换成list输出.

896、单调数列

if A == sorted(A,reverse=True) or A == sorted(A,reverse=False):
    return True
else:
    return False

排序后考察是否和原列表一致。如果用list.sort()会排序原列表,用sorted()则是新列表

你可能感兴趣的:(LeetCode个人笔记python篇(easy))