携程春招笔试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春招##携程笔试##笔试#