记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
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