第一题:
题目:给定字符串,判断到每一个字符为止,共有多少个递增子串。
T=int(input())
for tt in range(T):
N=int(input())
s=input()
ans=[1]
for i in range(1,N):
if s[i]>s[i-1]:
ans.append(ans[-1]+1)
else:
ans.append(1)
print('Case #%d: ' %(tt+1),end='')
print(*ans,sep=' ')
第二题:
题目:给定一个数组,在允许改动一个数字的情况下,求最长的等差数列
解释:首先计算相邻元素差;而后双指针,i为起始点,j为满足条件的最远位置,当两个元素之和为它们之前元素的2倍时,此时可通过改动一个数字,使当前等差数列长度加2,;并且此时可继续用while循环判断后面的差是否与当前差相等,如是,则等差数列可继续变长。注意:数组正反两个方向都需计算,
def diff(x):
aa=[]
n=len(x)
for i in range(1,n):
aa.append(x[i]-x[i-1])
return aa
def solve(s):
diff_=diff(s)
n=len(diff_)
i=0
j=0
most=0
while i<n:
while j<n and diff_[i]==diff_[j]:
j=j+1
most=max(most,j-i+1)
if j<n:
most=max(most,j-i+2)
if j<n-1 and diff_[j]+diff_[j+1]==2*diff_[i]:
end=j+2
while end<n and diff_[end]==diff_[i]:
end+=1
most=max(most,end-i+1)
i=j
return most
T=int(input())
for tt in range(T):
N=int(input())
s=[int(ii) for ii in input().split()]
ans=solve(s)
ans=max(ans,solve(s[::-1]))
print('Case #%d: %d' %(tt+1,ans))
第三题:
题目:求两个连续质数的乘积,要求乘积为最大且不大于Z
解释:从sqrt(Z)附近寻找最接近的质数(此处参考了https://zhuanlan.zhihu.com/p/371431414)
import math
def isprime(x):
if x==2:
return 1
if x==3:
return 1
for i in range(2,round(math.sqrt(x))+1):
if x%i==0:
return 0
return 1
T=int(input())
for tt in range(T):
Z=int(input())
ss=round(math.sqrt(Z))
while ss>0:
if isprime(ss):
break
else:
ss-=1
s1=ss
news=s1-1
while news>0:
if isprime(news):
break
else:
news-=1
s3=news
ss=round(math.sqrt(Z))+1
while ss<10000000000:
if isprime(ss):
break
else:
ss+=1
s2=ss
if s1*s2<=Z:
ans=s1*s2
else:
ans=s1*s3
print('Case #%d: %d' %(tt+1,ans))
唉,博士毕业到底何去何从呢?