给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
#方法一:Sunday算法
def strStr(haystack,needle): #目标字符串:haystack,模式串:needle
def calShift(s): #偏移表 (偏移距离是指从右边开始出现的到最右边的距离)
dic={} #abb 其中b的偏离距离为1
for i in range(len(s)-1,-1,-1):
if s[i] not in dic:
dic[s[i]]=len(s)-i
dic['ot']=len(s)+1 #其余距离都为长度+1
return dic
if len(haystack)=len(haystack): #若长度超出则返回-1
return -1
m=haystack[ind+len(needle)] #待匹配字符串的后一个元素
if dic.get(m): #获取偏移位
ind+=dic.get(m)
else:
ind+=dic.get('ot') #不在模式串中
return -1 if (ind+len(needle))>len(haystack) else ind #判断索引是否合理
#方法二:KMP算法
def strStr(haystack,needle):
def prefix_f(s): #求前缀函数,s[0,i]中最长相等前后缀长度
pi=[0 for i in range(len(s))]
j=0 #用于标记长度
for i in range(1,len(s)):
while j>0 and s[j]!=s[i]:
j=pi[j-1] #不等则j移到前一个相等所在的位置,继续比较,直到相等
if s[j]==s[i]:
j+=1
pi[i]=j
return pi
pi=prefix_f(needle) #获得模式串的前缀函数
#重复KMP算法
j=0
for i in range(len(haystack)): #例如abacdab ac abacdab的前缀函数为[0,0,1,,0,0,1,0]
while j>0 and haystack[i]!=needle[j]: #利用KMP算法可以跳过不符合的,到上一个匹配处
j=pi[j-1]
if haystack[i] == needle[j]:
j+=1
if j==len(needle):
return i-len(needle)+1
return -1
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
#方法一:利用index函数
def searchInsert(nums,target):
if target in nums:
return nums.index(target)
else:
nums.append(target)
nums.sort() #插入后,要重新排序
return nums.index(target)
print(searchInsert(nums = [1,3,5,6], target = 2))
#方法二:二分法
def searchInsert(nums,target):
left = 0
right = len(nums)-1
while left<=right:
mid=(left+right)//2 #二分,找到中间值
if nums[mid] target:
right=mid-1 #在mid的左边
else:
return mid
return left
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。
#方法一:直接利用split进行解决
def lengthOfLastWord(s):
l=s.split()
return len(l[-1])
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
#方法一:直接先转换成数字,然后加一,再转换成列表
def plusOne(digits):
d=[i for i in map(str,digits)]
d=''.join(d)
nd=int(d)+1
nd=str(nd)
nd=[i for i in map(int,list(nd))]
return nd
print(plusOne([1,2,3]))
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。
#方法一:直接循环遍历,找到可能的值,提前判断好1,0,2等值
def mySqrt(x):
if x<=1:
return x
for i in range(1,x):
if i*i==x:
return i
if i*i>x:
return (i-1)
return 1
#方法二:二分法查找
def mySqrt(x):
if x<=1:
return x #判断0,1
left=1
right = x
while left<=right:
mid=left+(right - left)//2
if mid*mid==x: #二分法经典模板
return mid
elif mid*mid>x:
right=mid-1
elif mid*mid