1.题:牛客项目发布项目版本时会有版本号,比如1.02.11,2.14.4等等。现在给你2个版本号version1和version2,请你比较他们的大小。
#利用两个指针表示字符串的下标,分别遍历两个字符串。
#将点之间的部分转化为数字再比较
#截取点之前的数字字符组成数字,即在遇到一个点之前,直接取数字,加在前面数字乘10的后面。
class Solution:
def compare(self , version1: str, version2: str) -> int:
i,j,=0,0
while i<len(version1) or j<len(version2):#双指针 从左遍历到右
n1,n2=0,0
while i <len(version1) and version1[i]!=".":#取一个点到一个点之间的数
n1=n1*10+int(version1[i])
i+=1
while j <len(version2) and version2[j]!=".":#取一个点到一个点之间的数
n2=n2*10+int(version2[j])
j+=1
if n1>n2:#每取一次点到点的结果,比较一次,比较出来就返回
return 1
elif n2>n1:
return -1
i+=1
j+=1
return 0 #比较完都无法比较出大小关系
2.题:给出两个字符串 s 和 t,要求在 s 中找出最短的包含 t 中所有字符的连续子串。
- #用指针p,q表示滑动窗口的左边界和右边界
1.不断增加q使滑动窗口增大,直到窗口包含了T的所有元素
2.增加p来求最小的字串:将不必要的元素排除在外,直到碰到一个必须包含的元素
3.让p再增加一个位置,开始寻找下一个满足条件的滑动窗口
class Solution:
def minWindow(self , s: str, T: str) -> str:
dic,p,q,count={},0,0,0
res=[0,float('inf')]#记录滑动窗口左右边界
for i in T:
dic[i]=dic.get(i,0)+1
count+=1#记录字典中的目标数量
while q<len(s):
#1.不断增加q使滑动窗口增大,
dic[s[q]]=dic.get(s[q],0)-1
if dic[s[q]]>-1:#遇到了T中元素
count-=1
if count==0:#直到窗口包含了T的所有元素
#2. 增加p,排除多余元素
while p<q:
if dic[s[p]]==0:#碰到一个必须包含的元素
break
elif dic[s[p]]<0:#多余元素
dic[s[p]]+=1#更新dic
p+=1#滑动窗口往右缩小
if q-p<res[1]-res[0]:#更新和记录索引p,q
res=[p,q]
q+=1
return '' if res[1]>len(s) else s[res[0]:res[1]+1]