【2021/4/4 刷题笔记】Leetcode之容易等级题

# 2021/4/4

目录

最长公共前缀

【题目】

【我的代码】

执行结果:

补充:

【其他方法】

执行结果:

验证回文串

【题目】

【我的代码】

执行结果:

补充:

【其他方法】

执行结果:

补充:

x 的平方根

【题目】

【我的代码】

执行结果:

【其他方法】

执行结果:


最长公共前缀

【题目】

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

提示:

  • 0 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

【我的代码】

class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if strs == []:
            return ''
        elif len(strs) == 1:
            return strs[0]
        strs.sort(key=len)
        maxl = len(strs[0])
        for i in range(maxl):
            for j in range(1,len(strs)):
                if strs[0][i]!=strs[j][i]:
                    return strs[0][:i]
        return strs[0]

执行结果:

执行用时:44 ms, 在所有 Python3 提交中击败了50.58%的用户

内存消耗:15 MB, 在所有 Python3 提交中击败了51.18%的用户

补充:

sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。

list.sort( key=None, reverse=False)
  • key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
  • reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。

【其他方法】

@xshura 的评论:

利用python的max()和min(),在Python里字符串是可以比较的,按照ascII值排,举例abb, aba,abac,最大为abb,最小为aba。所以只需要比较最大最小的公共前缀就是整个数组的公共前缀。

# 借鉴此思路的代码
class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs:
            return ''
        s1 = min(strs)
        s2 = max(strs)
        for i,x in enumerate(s1):
            if x != s2[i]:
                return s2[:i]
        return s1

执行结果:

执行用时:40 ms, 在所有 Python3 提交中击败了74.10%的用户

内存消耗:15.1 MB, 在所有 Python3 提交中击败了14.85%的用户


验证回文串

【题目】

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

【我的代码】

class Solution(object):
    def isPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        if s == '' or len(s)==1:
            return True
        import string
        right=string.ascii_lowercase+string.digits
        a = list(s.lower())
        i = 0
        j = len(a)-1
        while(i<j):
            while(a[i] not in right and i<j):
                i+=1
            while(a[j] not in right and i<j):
                j-=1
            if i==j:
                return True
            elif a[i]!=a[j]:
                return False
            else:
                i+=1
                j-=1
        return True

执行结果:

执行用时:68 ms, 在所有 Python 提交中击败了25.19%的用户

内存消耗:14.3 MB, 在所有 Python 提交中击败了58.52%的用户

补充:

用到了string模块,包含了一些字符串常量。

字符串常量包括:

string.ascii_letters
string.ascii_lowercase
string.ascii_uppercase
string.digits
string.hexdigits
string.octdigits
string.punctuation
string.printable
string.whitespace

【其他方法】

@TZZL 的评论:

# python3
class Solution:
    def isPalindrome(self, s: str) -> bool:
        s = ''.join(filter(str.isalnum,s)).lower()
        return s==s[::-1]

执行结果:

执行用时:44 ms, 在所有 Python3 提交中击败了95.75%的用户

内存消耗:15.2 MB, 在所有 Python3 提交中击败了51.34%的用户

补充:

1、filter() 函数

用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

注意: Python2.7 返回列表,Python3.x 返回迭代器对象,具体内容可以查看:Python3 filter() 函数

filter(function, iterable)
  • function -- 判断函数。
  • iterable -- 可迭代对象。

2、isalnum() 方法检测字符串是否由字母和数字组成。

str.isalnum()

x 的平方根

【题目】

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sqrtx
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

【我的代码】

class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x<1:
            return 0
        elif x<4:
            return 1
        else:
            i = 2
            while(i*i<=x):
                i += 1
            return i-1

执行结果:

执行用时:1248 ms, 在所有 Python 提交中击败了7.06%的用户

内存消耗:12.8 MB, 在所有 Python 提交中击败了86.90%的用户

【其他方法】

@Noble MonsterL3 的评论:

二分查找,用x/m<m而不是m*m>x防止溢出

# 借鉴此思路的代码
class Solution(object):
    def mySqrt(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x<1:
            return 0
        elif x<4:
            return 1
        else:
            min = 2
            max = x
            
            while(max-min>1):
                i = (max+min)//2
                if x//i<i:
                   max = i
                else:
                    min = i 
            return min

执行结果:

执行用时:32 ms, 在所有 Python 提交中击败了53.85%的用户

内存消耗:12.9 MB, 在所有 Python 提交中击败了79.08%的用户

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值