# 2021/4/4
目录
最长公共前缀
【题目】
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串
""
。提示:
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%的用户