网易互娱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)<k: 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的代码
#网易互娱##笔试题目##测试开发工程师#