携程春招笔试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春招##携程笔试##笔试#
全部评论
第三题其实就020,101,121,202四种情况满足条件,dfs暴力枚举四种情况即可,注意字符长度小于等于2的情况。第四题,二分答案,二分得到的值作为本次的重量,去跑一次最短路,直到找到最大满足条件的重量
3 回复 分享
发布于 2023-05-04 22:55 浙江
第三题就38 第四题10 佬太强了
2 回复 分享
发布于 2023-05-04 23:18 湖北
第三题ac,dfs容易爆栈,str长度0123先分别讨论,长度大于3分只能是202020...或者020202...
1 回复 分享
发布于 2023-05-04 23:37 河北
第四题最快的应该是二分加短路了:O( V log(V+W))
1 回复 分享
发布于 2023-05-05 06:09 美国
第三题dfs 可以,但是需要原地改,建新的append又pop 时间复杂度比较高感觉,第四题是受限制的迪杰斯特拉,不过我暴击过了25%
点赞 回复 分享
发布于 2023-05-04 22:49 美国
第四题我直接输出-1也是15%
点赞 回复 分享
发布于 2023-05-04 23:04 美国
我第一题只有15%是为什么
点赞 回复 分享
发布于 2023-05-05 15:18 江苏

相关推荐

10-15 10:57
已编辑
武昌理工学院 FPGA工程师
狠赚笔第一人:老哥学院本没实习还想拿13k学Java狠赚笔呢
点赞 评论 收藏
分享
我在朝九晚六双休的联想等你:如果我是你,身体素质好我会去参军,然后走士兵计划考研211只需要200多分。
点赞 评论 收藏
分享
评论
2
16
分享
牛客网
牛客企业服务