刷了十道easy题,简单是简单,坑也是真的多啊。

 半夜三点了,好困

 

LeetCode #14 最长公共前缀

判断是否为空列表,判断是否有空字符串在列表里面,对列表进行去重处理。对列表最短元素进行查找,(最短元素必满足最长公共前缀条件。水桶短板原理)返回最短元素位置,个数,是否全为1个长度,最短长度 四个维度。为1长度超过一个,则为没有最长公共前缀(以对列表进行去重处理)。如果列表只有一个元素,则返回这个元素。如果不全为一个长度且最短长度为1.判断列表内所有元素是否有公共前缀。不满足上列条件则证明有公共前缀在进行判断,取最短列表元素作为对比目标,依次对比,找到断点t,返回目标[0:t]

 

这题坑是真的有很多,半天时间花这道题上面了。。。

class Solution(object):
    def longestCommonPrefix(self, strs):
        if strs != []:
            if '' in strs:
                return ''
            strs = list(set(strs))
            shortest, longflag, seat, onestr = self.shortestStr(strs)
            contrast_strs = strs[seat]
            strs.pop(seat)
            if onestr > 1:
                return ''
            if len(strs) == 0:
                return contrast_strs
            if longflag == False and shortest == 1:
                for i in range(len(strs)):
                    if contrast_strs != strs[i] :
                        break
                    else :
                        return ''
            t = 0
            while t < shortest:
                for i in range(len(strs)):
                    if contrast_strs[t] == strs[i][t]:
                        a = contrast_strs[0:t]
                    else:
                        return contrast_strs[0:t]
                t += 1
            return contrast_strs[0:t]
        else :
            return ''

    def shortestStr(self,strs):
        lenght = 1000000
        flag = True
        seat = 0
        oneTime = 0
        for i in range(len(strs)):
            if len(strs[i]) < lenght:
                lenght = len(strs[i])
                seat = i
            if len(strs[i]) != 1:
                flag = False
            else :
                oneTime += 1
        return lenght, flag, seat, oneTime

LeetCode #20 有效的括号

这题比较简单,创建一个括号类型字典,一个新的列表储存值。

字符串为空值返回true,这里踩了一次坑。再判断字符串长度,如果除2有余数,不可能满足条件,返回false。

判断第一个字符 是否再字典中,不在的话,即不满足条件。

从s[1]开始查找。如果s[i]在括号类型字典内,且与之前存的类型对应的话,新建列表删除该符号,如果不在s[i]内的话,

存入新建列表,与后面的进行匹配。

最后返回 new_list == [] 若全部匹配,则为true,有值未被删除,则为false

class Solution(object):
    def isValid(self, s):
        bracketTpye ={
            ')':'(',
            '}':'{',
            ']':'['
        }
        new_list = []
        if s == '' :
            return True
        if len(s)%2 != 0 :
            return False
        if s[0] not in bracketTpye:
            new_list.append(s[0])
        else :
            return False     
        for i in s[1:] :
            if i in bracketTpye and bracketTpye[i] == new_list[-1]:
                new_list.pop()
            else :
                new_list.append(i)
        return new_list == []

LeetCode #28. 实现strStr()

这题比较简单,判断目标字符串是否等于对象字符串里面,或者目标字符串为空值 

不在的话判断目标字符串是否存在于对象字符串

在的话,直接查找位置,不在返回值

class Solution(object):
    def strStr(self, haystack, needle):
        if needle == '' or haystack == needle :
            return 0
        else :
            if needle in haystack :
                for i in range(0,len(haystack)-len(needle)+1):
                    if haystack[i:len(needle)+i] == needle:
                        return i
            return -1

LeetCode #53 最大子序和

把当前位置的数与前一位之和相加,若大于当前位置的数的话,把当前位置的数替换成两数之和。

在对nums进行排序,取最大值

class Solution:
    def maxSubArray(self, nums):
        for i in range(1,len(nums)):
            if nums[i]+nums[i-1] > nums[i]:
                nums[i] = nums[i]+nums[i-1]
        nums.sort()
        return nums[-1]

LeetCode #最后一个单词的长度

对字符串进行倒序处理。

创建一个状态指针,指示英文字母之前有没有空格。

从后开始查找,遇到空格且指针指示空格之前没有字母,直接跳过

遇到英文字母,对指针状态进行改变,长度变量加一

遇到空格,指针指示空格之前有字母,跳出循环。

class Solution(object):
    def lengthOfLastWord(self, s):
        s = s[::-1]
        flag = True
        strlong = 0
        for i in range(len(s)):
            if s[i]== " " and flag :
                continue
            elif s[i] != ' ':
                flag = False
                strlong += 1
            else :
                break
        return strlong

LeetCode #69 x的平方根

二分法

用了一次循环,内存溢出,然后改用二分查找,AC了

设置左坐标指针=0,右坐标指针x

判断 左边小于右边

mid = 等于左右两数之和的一半

当mid的平方大于时x在左边,移动右指针

当 mid的平方小于时x在右边,移动左指针

class Solution:
    def mySqrt(self, x):
        left=0;right=x
        while left<right:
            mid=int((left+right)/2)
            if x<mid**2:
                right=mid
            else:
                left=mid+1
        if left>1:
            return left-1
        else:
            return left

LeetCode #70 爬楼梯

递推,类似于斐波那契数列。每一集台阶可以走的种数等于前两集之和

创建一个数组,储存每一级台阶可以走的种数。

1集台阶 1种 1步

2集台阶 2种 1步1步 2步

3集台阶 3种 1步1步1步 2步1步 1步2步

4集台阶 5种 3+2

5集台阶 8种 5+3

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        pace = []
        pace.append(1)
        pace.append(1)
        for i in range(2, n+1):
            pace.append(pace[i-1]+pace[i-2])
        return pace[n]

LeetCode #88 合并两个有序数组

合并,排序

class Solution(object):
    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.
        """
        for i in range(m,m+n):
            nums1[i] = nums2[i-m]
        nums1.sort()