Bootstrap

LeetCode 每日一题 2025/1/6-2025/1/12

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步




1/6 2274. 不含特殊楼层的最大连续楼层数

将bottom top加入数组中 遍历算出相邻最大值

def maxConsecutive(bottom, top, special):
    """
    :type bottom: int
    :type top: int
    :type special: List[int]
    :rtype: int
    """
    special.sort()
    l = [bottom-1]+special+[top+1]
    return max([l[i+1]-l[i]-1 for i in range(len(l)-1)] )

        



1/7 3019. 按键变更的次数

变成小写字母
从头遍历 寻找相邻不同的个数

def countKeyChanges(s):
    """
    :type s: str
    :rtype: int
    """
    s=s.lower()
    ans = 0
    for i in range(1,len(s)):
        if s[i]!=s[i-1]:
            ans+=1
    return ans



1/8 2264. 字符串中最大的 3 位相同数字

遍历 判断是否存在连续3个相同数字

def largestGoodInteger(num):
    """
    :type num: str
    :rtype: str
    """
    v=""
    for i in range(len(num)-2):
        if num[i]==num[i+1]==num[i+2]:
            if num[i]>v:
                v=num[i]
    return "" if v=="" else v*3



1/9 3297. 统计重新排列后包含另一个字符串的子字符串数目 I

满足条件的x 即x内需要包含word2所有字符
对于每个子字符串左侧端点l 找到它满足条件最短时的右端点r
更右侧的所有必定都满足 可以有n-r+1个子字符串
滑动窗口记录l,r
diff记录满足word2每个字符还差几个
cnt记录不满足个数的字符个数

def validSubstringCount(word1, word2):
    """
    :type word1: str
    :type word2: str
    :rtype: int
    """
    n=len(word1)
    diff=[0]*26
    for c in word2:
        diff[ord(c)-ord('a')]-=1
    ans = 0
    global cnt
    cnt = sum(1 for c in diff if c<0)
    
    def update(c,add):
        global cnt
        diff[c]+=add
        if add==1 and diff[c]==0:
            cnt-=1
        elif add==-1 and diff[c]==-1:
            cnt+=1
    l,r=0,0
    while l<len(word1):
        while r<len(word1) and cnt>0:
            update(ord(word1[r])-ord('a'),1)
            r+=1 
        if cnt==0:
            ans+=n-r+1
        update(ord(word1[l])-ord('a'), -1)
        l+=1 
    return ans



1/10 3298. 统计重新排列后包含另一个字符串的子字符串数目 II

满足条件的x 即x内需要包含word2所有字符
对于每个子字符串左侧端点l 找到它满足条件最短时的右端点r
更右侧的所有必定都满足 可以有n-r+1个子字符串
滑动窗口记录l,r
diff记录满足word2每个字符还差几个
cnt记录不满足个数的字符个数

def validSubstringCount(word1, word2):
    """
    :type word1: str
    :type word2: str
    :rtype: int
    """
    n=len(word1)
    diff=[0]*26
    for c in word2:
        diff[ord(c)-ord('a')]-=1
    ans = 0
    global cnt
    cnt = sum(1 for c in diff if c<0)
    
    def update(c,add):
        global cnt
        diff[c]+=add
        if add==1 and diff[c]==0:
            cnt-=1
        elif add==-1 and diff[c]==-1:
            cnt+=1
    l,r=0,0
    while l<len(word1):
        while r<len(word1) and cnt>0:
            update(ord(word1[r])-ord('a'),1)
            r+=1 
        if cnt==0:
            ans+=n-r+1
        update(ord(word1[l])-ord('a'), -1)
        l+=1 
    return ans



1/11 3270. 求出数字答案

依次求最小值

def generateKey(num1, num2, num3):
    """
    :type num1: int
    :type num2: int
    :type num3: int
    :rtype: int
    """
    ans = 0
    for i in range(4):
        ans+=min(num1%10,num2%10,num3%10)*(10**i)
        num1//=10
        num2//=10
        num3//=10
    return ans



1/12





;