携程春招笔试2023.5.4
第一题
输入一个字符串,如果是大写字母就改为改为后一个字母,如果是小写就改为前一个,其他字符不变。边界情况Z→A,a→z
本人答案:AC
s=input()
for c in s:
num=ord(c)
if num>=65 and num <90:
print(chr(num+1),end="")
elif num==90:
print("A",end="")
elif num>97 and num <=122:
print(chr(num-1),end="")
elif num==97:
print("z",end="")
else:
print(c,end="")
print("")
第二题
输入n个字符串,每个字符串有一个权重,求一个是另一个的字串的情况下的最大权重和。
本人答案:AC。
思路:循环暴力穷举。
n=int(input())
li=[]
for i in range(n):
s,a=input().split(" ")
a=int(a)
li.append((s,a))
maxval=-1
for i in range(n):
for j in range(n):
if i==j:
continue
s1,a1=li[i]
s2,a2=li[j]
if s1.find(s2)>-1 or s2.find(s1)>-1: # s2 in s1
if a1+a2>maxval:
maxval=a1+a2
print(maxval)
第三题
输入一个由0,1,2组成的字符串,其中有些位不知道,被?代替了。已知字符串符合两个特点:(1)相邻两个字符不能相同(2)连续三个字符代表的三进制数能被2整除。要求复原字符串,如果没有符合的输出-1。多个答案输出一个即可。
我的答案:超时,正确率95%。
思路:dfs穷举所有?的可能,逐一判断是否合法。
s=input()
n=len(s)
li=[]
pos=[]
for i in range(n):
if s[i]=="?":
li.append("?")
pos.append(i)
else:
li.append(int(s[i]))
# print(li,n,pos)
def getnum(li):
res=0
n=len(li)
for i in range(n):
m=n-i-1
# print(i,m)
res+=li[i]*3**m
return res
def isvalid(li):
for i in range(len(li)):
if i-1>=0 and i-1<n:
if li[i]==li[i-1]:
# print(li,i,i-1,li[i],li[i-1])
return False
if i-2>=0 and i-2<n:
num=getnum(li[i-2:i+1])
if num%2!=0:
return False
return True
res=[]
def dfs(sli,spos):
if len(spos)==0:
# print(sli,spos,"IS VALID?")
if isvalid(sli):
res.append(sli)
# print(sli)
else:
if isvalid(sli[:spos[0]]):
i=spos[0]
# print(i)
for j in [0,1,2]:
newli=sli.copy()
newli[i]=j
# print(sli)
dfs(newli,spos[1:])
dfs(li,pos)
if len(res)==0:
print(-1)
else:
# print(res)
for i in range(len(res[0])):
print(res[0][i],end="")
print("")
第四题
游游想从地点1走到n,一共有m条路,每条路会告知最大承重和长度,要求经过的总历程不超过h,求一路上能背负的最大的载重w。如果不能到达目的地,输出-1.
第一行输入n,m,h。
后面m行每行输入一条路的信息,u,v,w,d,分别是起点,终点,这条路最大载重,这条路的长度。
本人答案:超时,正确率15%
思路:dfs穷举
n,m,h=[int(x) for x in input().split(" ")]
M=[]
idx={}
for i in range(m):
u,v,w,d=[int(x) for x in input().split(" ")]
M.append([u,v,w,d])
if u not in idx.keys():
idx[u]=[i]
else:
idx[u].append(i)
if v not in idx.keys():
idx[v]=[i]
else:
idx[v].append(i)
# print(M,idx)
maxw=[]
def dfs(u,w,d):
if u==n:
maxw.append(w)
else:
for i in idx[u]:
ui,vi,wi,di=M[i]
if ui==u:
tgt=vi
elif vi==u:
tgt=ui
if d+di<=h:
dfs(tgt,min(w,wi),d+di) # go to vi
dfs(1,1000000001,0)
if maxw==[]:
print(-1)
else:
print(max(maxw))
想问问各位大佬3、4题有啥好办法,我想到的就是dfs穷举,都超时了。而且不知道4为啥通过率这么低,是因为超时吗还是因为逻辑不对。自认为逻辑对的。orz。
#携程##携程春招##携程2023春招##携程笔试##笔试#
