力扣刷题 day06:09-05

1.找出字符串中第一个匹配项的下标

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 。力扣刷题 day06:09-05_第1张图片 

方法一:Sunday算法

#方法一: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算法 

#方法二: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

2.搜索插入位置 

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

请必须使用时间复杂度为 O(log n) 的算法。力扣刷题 day06:09-05_第2张图片

 方法一:利用index函数

#方法一:利用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

3.最后一个单词的长度 

 

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。

单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。力扣刷题 day06:09-05_第3张图片

方法一:直接利用split进行解决 

#方法一:直接利用split进行解决
def lengthOfLastWord(s):
    l=s.split()
    return len(l[-1])

4.加一  

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

 力扣刷题 day06:09-05_第4张图片

方法一:直接先转换成数字,然后加一,再转换成列表

#方法一:直接先转换成数字,然后加一,再转换成列表
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]))

5.x的平方根 

 

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。

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

注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。力扣刷题 day06:09-05_第5张图片

方法一:直接循环遍历,找到可能的值,提前判断好1,0,2等值 

#方法一:直接循环遍历,找到可能的值,提前判断好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

 

你可能感兴趣的:(力扣刷题,leetcode,算法,职场和发展)