python-Leetcode

简单题型
1.两数之和

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

7.反转整数

class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        if -10<x<10:
            return x
        s = str(x)
        if s[0] != '-':
            s = s[::-1]
            x = int(s)
        else:
            s = s[1:][::-1]
            x = int(s)
            x = -x
        return x if -2147483648 < x < 2147483647 else 0

9.回文数

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

13.罗马数字转整数

class Solution:
    def romanToInt(self, s):
        """
        :type s: str
        :rtype: int
        """
        map = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        sum = 0
        for i in range(len(s)):
            if i+1 == len(s) or map[s[i]]>=map[s[i+1]]:
                sum += map[s[i]]
            else:
                sum -= map[s[i]]
        return sum

14.最长公共前缀

class Solution:
    def longestCommonPrefix(self, strs):
        """
        :type strs: List[str]
        :rtype: str
        """
        if strs == None or len(strs)<=0:
            return ''
        s1 = min(strs)
        s2 = max(strs)
        for i, c in enumerate(s1):
            # 比较是否相同的字符串,不相同则使用下标截取字符串
            if c != s2[i]:
                return s1[:i]
        return s1

8.字符串转整数
利用正则化解决字母索引问题,还可以用ASCll码解决字母,数字的索引问题

class Solution:
    def myAtoi(self, str):
        """
        :type str: str
        :rtype: int
        """
        import re #引入正则化模块

        #正则化中^代表用^后面的开头,[-+]?表示[-+]可以出现,也可以不出现,\d匹配所有数字,\d+数字后面可以连接无数数字,但不能是其他东西,包括空格和字母
        list_s = re.findall(r"^[-+]?\d+", str.strip()) #删除前,后空格。这样容易导致开始碰到字母就为空列表
        #print(list_s)
        if not list_s: 
            return 0  #字母开始列表是空的,直接返回0
        else:
            num =int(''.join(list_s)) #列表转化为字符串,然后转化为整数
            if num >2**31 -1:
                return 2**31 -1
            elif num < -2**31:
                return -2**31
            else:
                return num

283.将0放在列表的所有非0元素之后
思路一:利用O(n)的辅助空间完成0元素的后移
时间复杂度O(n)
空间复杂度O(n)

class Solution:
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        alist = []
        for i in range(len(nums)):
            if nums[i]:
                alist.append(nums[i])
        for i in range(len(alist)):
            nums[i] = alist[i]
        for i in range(len(alist),len(nums)):
            nums[i] = 0

思路二:不使用辅助空间,原地完成0元素后移
时间复杂度O(n)
空间复杂度O(1)

class Solution:
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        k = 0
        for i in range(len(nums)):
            if nums[i]:
                nums[k]=nums[i]
                k+=1
        for i in range(k,len(nums)):
            nums[i] = 0

思路三:直接交换0和非0元素

class Solution:
    def moveZeroes(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        k = 0
        for i in range(len(nums)):
            if nums[i]:
                tmp = nums[k]
                nums[k]=nums[i]
                nums[i] = tmp
                k+=1

27.移除元素
原地移除,O(1)的空间复杂度
思路一:

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

思路二:删除元素之后顺序可以改变,不断将最后一个元素替换val的元素即可

class Solution:
    def removeElement(self, nums, val):
        """
        :type nums: List[int]
        :type val: int
        :rtype: int
        """
        i = 0
        n = len(nums)
        while i<n:
            if nums[i] == val:
                nums[i] = nums[n-1]
                n -= 1
            else:
                i+=1
        return n

75.颜色分类
思路一:计数排序,简单解法
时间复杂度O(n)
空间复杂度O(k)

class Solution:
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        count = [0]*3
        for i in range(len(nums)):
            if nums[i]==0:
                count[0]+=1
            if nums[i]==1:
                count[1]+=1
            if nums[i]==2:
                count[2]+=1
        index = 0
        for i in range(count[0]):
            nums[index]=0
            index+=1
        for i in range(count[1]):
            nums[index]=1
            index+=1
        for i in range(count[2]):
            nums[index]=2
            index+=1

思路二:三路快排
时间复杂度O(n)
空间复杂度O(1)
只需遍历数组一次

class Solution:
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        zero = -1
        two = len(nums)
        i = 0
        while i<two:
            if nums[i]==1:
                i+=1
            elif nums[i]==2:
                two -=1
                nums[i],nums[two] = nums[two],nums[i]
            elif nums[i]==0:
                zero +=1
                nums[i],nums[zero] = nums[zero],nums[i]
                i+=1

88.合并两个有序数组
从后向前比较,将nums1和nums2中的最大值放在数组的最后的位置,不断向前遍历

class Solution:
    def merge(self, nums1, m, nums2, n):
        """
        :type nums1: List[int]
        :type m: int
        :type nums2: List[int]
        :type n: int
        :rtype: void Do not return anything, modify nums1 in-place instead.
        """
        if n==0:
            return 
        elif m==0 and n>=0:
            for i in range(n):
                nums1[i]=nums2[i]
        else:
            i = m-1
            j = n-1
            k = m+n-1
            while i>=0 and j>=0:
                if nums1[i]>nums2[j]:
                    nums1[k]=nums1[i]
                    i -=1
                else:
                    nums1[k]=nums2[j]
                    j-=1
                k-=1
            while i>=0:
                nums1[k]=nums1[i]
                i-=1
                k-=1
            while j>=0:
                nums1[k]=nums2[j]
                j-=1
                k-=1

猜你喜欢

转载自blog.csdn.net/weixin_40117002/article/details/82113664