牛客网编程题python list_网易互娱4.11测开笔试,五题编程回顾(附Python代码)

五题代码分别过了 100 83.33 100 20 54.54

前三题简单,第四题是真的难,第五题也蛮难的。。

第一题:游戏里面的一个机制是死亡后金币减半(取天棚计算),求角色死亡N次后的金币剩余量

简单题 不说了

import math

t=int (input())

dict={}

for i in range(t):

list=[0]*2

list=[int (i) for i in input().split()]

dict[i]=list

for i in range(t):

for j in range(dict[i][1]): #death time

dict[i][0]=math.ceil(dict[i][0]/2)

print(dict[i][0])

第二题:

扑克排序 A~K分别对应1~13的权重 四种花色对应(d:0,c:13,h:26,s:39)四个权重,一张牌的权重由扑克的点数和花数相加决定比如3 d的权重就是3

现在输入n张扑克,要从权重从小到大排序,并且连续的权重只留首尾两张牌,不连续的就保留,然后输出最后的扑克序列

我的思路就是直接暴力搞,先放两个字典存两个权重,然后依次输入扑克的时候就再建一个字典,存每一个扑克的初始位置和权重(因为最后的输出排序是和最开始的不一样的,所以需要一个字典记录位置),然后对输入扑克列表排序,第一张和最后一张一定保留,中间的扑克,如果它的值不等于前面的+1或者后面的-1就保留(说明他是单牌或者是连续序列的首尾)。最后在保留下来的扑克里面依次去字典里找对应的扑克和花色

这里要注意,因为它扑克权重是1~13 花色权重是0 13 26 39,这样可以保证任何一张牌的权重都不一样(从1d~Ks正好是1~52),所以可以放心地建字典找

但是我只过了83.33.。有个例子不知道是啥没过

还有就是我这字典有可能建反了,其实我感觉最好的方法是可以在最后那个字典里面用二分来查的,我就是最开始准备二分来查,结果发现不行,我想错了。。。

dict_poke={'A':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'10':10,'J':11,'Q':12,'K':13}

dict_color={'d':0,'c':13,'h':26,'s':36}

n=int(input())

list=[]

for i in range(n):

list.append(input().split())

dict_value={}

sort_list=[]

for i in range(n):

dict_value[i]=dict_poke[list[i][0]]+dict_color[list[i][1]]

sort_list.append(dict_poke[list[i][0]]+dict_color[list[i][1]]) #用于排序

sort_list.sort()

final_list=[sort_list[0]]

for i in range(1,len(sort_list)-1):

if sort_list[i]-1 != sort_list[i-1]&nbs***bsp;sort_list[i]+1 != sort_list[i+1]:

final_list.append(sort_list[i])

final_list.append(sort_list[-1])

for i in range(len(final_list)):

for j in range(len(dict_value)):

if dict_value[j]==final_list[i]:

print(list[j][0],list[j][1])

第三题:

有n个帮派,帮派里面的人数量不定,每个人都有一个战斗值,现在要从全部人里面选出战斗值前k大的人出来决战,输出按逆序

topK问题,维护一个节点数为k的最小堆就可以了

具体看代码

对了 这里有个问题是因为每个帮派的人数量不一定,所以说整个二维数组里面的有些值是空的,刚才有个人问我为啥数组总越界估计就是这里出了问题,遍历每一行(就是每个帮派)的时候要重新计算这一行的列数(就是这个帮派的人数),我当时在这里也搞了蛮久。。

import heapq

k,n=input().split()

k=int(k)

n=int(n)

list=[]

for i in range(n):

list.append(input().split())

heap=[]

heapq.heapify(heap)

row=len(list)

#col=len(list[i]) 不能放这里

for i in range(row):

col=len(list[i])

for j in range(col):

if not list[i][j]:

continue

list[i][j]=int(list[i][j])

if len(heap)

heapq.heappush(heap,list[i][j])

elif list[i][j] >heap[0]:

heapq.heapreplace(heap,list[i][j])

heap.sort(reverse=True)

for i in heap:

print(i,end=" ") 第四题:

给一堆点给你叫你求这些点的对称坐标。。。我是真的不会求,四个点两条线我会手算,N个点我是真的不会,需要一个数学大佬出来教教我们。最后我随便搞了个点数比较少的做法过了一个例子(20%)。。。

第五题:

就是三个字符串之间的LCS(最长公共子串问题),两个字符串之间直接动态规划就行,算法导论那本书里面有,网上也一大堆讲解的,这里我就不讲了。但是三个字符串我又懵了。。最后我就把写了个两个字符串之间的LCS函数,然后把三个字符串两两放进去比,然后输出他们那三个最长公共子串中最短的一个,这样做明显是有问题的,因为我返回的其实还是其中两个字符串的LCS,这并不代表另一个字符串也有相同的公共子串。最后这个方法骗了54.54,还算蛮幸运,我想过用一个字典存一下两个字符串之间的公共子串及其长度,发现实现起来有点困难。。。希望有大佬放出来ac的代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值