京东算法笔试编程题

参加了京东算法的笔试,当场因为赛码编译器不熟练,浪费了好多时间没有答完,笔试完在本地编译器完成了两道算法大题,不知道是不是能全部通过的答案
1,、迷宫问题
2、消消乐问题
#京东##笔试题目#
全部评论
大佬面试过了没?
点赞 回复 分享
发布于 2019-09-03 20:55
感谢大佬分享解题思路
点赞 回复 分享
发布于 2019-08-29 16:32
大佬还记得输入输出是什么吗?
点赞 回复 分享
发布于 2019-08-28 15:01
我也参加了,表示没做出来
点赞 回复 分享
发布于 2019-08-28 14:59
消消乐问题: 用一个感染函数,一个标志矩阵(初始值为1),把与初始点相同且连成一片的位置,对应在标志矩阵的位置改为0,然后与初始矩阵进行对应位置相乘的操作,则初始矩阵被消除的位置变为0,其他位置数字保持不变,然后执行下沉操作,对下沉完成的矩阵继续执行开始的消除操作 开始写的版本是贪心的,就是每次消除最大数量的点,但后来感觉不合适,不是最优解。后来改成每次从上到下,从左到右顺序‘感染’,只要凑够三个就删除 从上到下,从左到右顺序消除: import numpy as np class returndata():#每个点给上一个点返回的信息(与本点相邻且相同的点有多少个?)     subnum = 0     def __init__(self,subnum):         self.subnum = subnum #感染函数(给定flaglist矩阵,把能连城一片的点的位置,对应在flaglist中表为0) def infect(i, j, number, checkerboard, flagList):     if i<0 or i >= len(checkerboard) or j<0 or j>= len(checkerboard[0]) or checkerboard[i][j] != number or \     flagList[i][j]==0 or number == 0:         return returndata(0)     flagList[i][j] = 0     sumsubnum = returndata(1)     #从上下左右四个方向继续“感染”     a = infect(i + 1, j, checkerboard[i][j], checkerboard, flagList)     b = infect(i - 1, j, number, checkerboard, flagList)     c = infect(i, j + 1, checkerboard[i][j], checkerboard, flagList)     d = infect(i, j - 1, number, checkerboard, flagList)     sumsubnum.subnum += a.subnum+b.subnum+c.subnum+d.subnum     return sumsubnum#返回值为 从此点出发,最多能删除的点的个数 #下沉函数,把不是0的数都下沉下去 def down(matrix):     for i in range(len(matrix)-1,0,-1):         for j in range(len(matrix[0])):             if matrix[i][j]==0:                 for h in range(i-1,-1,-1):                     if matrix[h][j]!=0:                         matrix[i][j] = matrix[h][j]                         matrix[h][j] = 0     return matrix checkerboard = np.array([[3, 1, 2, 1, 1, ], \                          [1, 1, 1, 1, 3], \                          [1, 1, 1, 1, 1], \                          [1, 1, 1, 1, 1], \                          [3, 1, 2, 2, 2]]) row = checkerboard.shape[0]  # 获取行数 col = checkerboard.shape[1]  # 获取列数 flagList = [[1] * col for i in range(row)]  # 创建标志矩阵,初始值为1,能删除的位置变为0 flagList = np.array(flagList) #print(checkerboard) for i in range(row):     for j in range(col):         flagList = [[1] * col for k in range(row)]#消除矩阵         flagList = np.array(flagList)         result = infect(i, j, checkerboard[i][j], checkerboard, flagList)         if result.subnum>=3:#如果相同点连通个数大于等于3,则进行消除操作             checkerboard = checkerboard*flagList             checkerboard = down(checkerboard)             print(checkerboard) count = 0#最后剩下的不能删除的点的个数 for lst in checkerboard:     for x in lst:         if x!=0:             count+=1 print(count) 贪心版本: import numpy as np class returndata():#返回的信息(与本点相邻的点有多少个?)     subnum = 0     def __init__(self,subnum):         self.subnum = subnum def infect(i, j, number, checkerboard, flagList):#感染函数     if i<0 or i >= len(checkerboard) or j<0 or j>= len(checkerboard[0]) or checkerboard[i][j] != number or \     flagList[i][j]==0 or number == 0:         return returndata(0)     flagList[i][j] = 0     sumsubnum = returndata(1)     a = infect(i + 1, j, checkerboard[i][j], checkerboard, flagList)     b = infect(i - 1, j, number, checkerboard, flagList)     c = infect(i, j + 1, checkerboard[i][j], checkerboard, flagList)     d = infect(i, j - 1, number, checkerboard, flagList)     sumsubnum.subnum += a.subnum+b.subnum+c.subnum+d.subnum     return sumsubnum def down(matrix):#把不是0的都沉下去     for i in range(len(matrix)-1,0,-1):         for j in range(len(matrix[0])):             if matrix[i][j]==0:                 for h in range(i-1,-1,-1):                     if matrix[h][j]!=0:                         matrix[i][j] = matrix[h][j]                         matrix[h][j] = 0     return matrix checkerboard = np.array([[3, 1, 2, 1, 1, ], \                          [1, 1, 1, 1, 3], \                          [1, 1, 1, 1, 1], \                          [1, 1, 1, 1, 1], \                          [3, 1, 2, 2, 2]]) row = checkerboard.shape[0]  # 获取行数 col = checkerboard.shape[1]  # 获取列数 flagList = [[1] * col for i in range(row)] flagList = np.array(flagList) print(checkerboard) dic = {}#key:可删除点的个数 value:对应个数的标志矩阵(0 1矩阵) while True:     dic.clear()     for i in range(row):         for j in range(col):             flagList = [[1] * col for k in range(row)]#消除矩阵             flagList = np.array(flagList)             result = infect(i, j, checkerboard[i][j], checkerboard, flagList)             if result.subnum>=3:                 dic[result.subnum] = flagList     if dic=={}:#结束条件(不能再消除的时候结束)         break     #if max(dic.keys())<3:     #    break     maxdeletematrix = dic.get(max(dic.keys()))     checkerboard = checkerboard*maxdeletematrix     checkerboard = down(checkerboard)     print(checkerboard) count = 0#最后剩下的不能删除的点的个数 for lst in checkerboard:     for x in lst:         if x!=0:             count+=1 print(count)
点赞 回复 分享
发布于 2019-08-28 14:27
大佬得到面试通知了吗
点赞 回复 分享
发布于 2019-08-28 14:09
迷宫问题:把传入的矩阵matrix,扩成每行每列各三个matrix(共9个)的大矩阵,从最左上角的小matrix中的‘S’出发,沿可走的路径寻找,如果能找找到其它的‘S’,则是通的,s出发就能到无穷多位置 import numpy as np def s_location(matrix):#定位S在矩阵中位置     for i in range(len(matrix)):         if 'S' in matrix[i]:             j = matrix[i].index('S')             return [i, j] def findanother_S(matrix, i, j):#在大矩阵中沿可通过路径寻找其它S,若找到则说明是连通的     if i<0 or i>=len(matrix) or j<0 or j>= len(matrix) or matrix[i][j] == '#':         return False     if matrix[i][j] == 'S':         return True     if findanother_S(matrix, i + 1, j):         print(i+1, j)         return True     if findanother_S(matrix, i - 1, j):         print(i-1, j)         return True     if findanother_S(matrix, i, j + 1):         print(i, j+1)         return True     if findanother_S(matrix, i, j - 1):         print(i, j-1)         return True     return False def isok(matrix):#判断matrix矩阵中S是否可以到达无穷多位置     i, j = s_location(matrix)  # i,j     matrix = np.array(matrix)#把matrix变成每行、每列各3个(共九个)matrix的大矩阵     matrix = np.concatenate([matrix] * 3, axis=1)     matrix = np.concatenate([matrix] * 3, axis=0)     matrix[i][j] = '#'     print(matrix)     if findanother_S(matrix, i + 1, j):         print(i+1,j)         return True     if findanother_S(matrix, i - 1, j):         print(i-1,j)         return True     if findanother_S(matrix, i, j + 1):         print(i,j+1)         return True     if findanother_S(matrix, i, j - 1):         print(i,j-1)         return True     print(i,j)     return False if __name__== '__main__':     matrix1 = [['S', '#'], ['#', '.']]     matrix2 = [['.', '.', '.'], ['#', '#', '#'], ['#', 'S', '#']]     result = isok(matrix2)     print(result)
点赞 回复 分享
发布于 2019-08-28 13:58

相关推荐

求问大家offer选择:offer1:&nbsp;字节抖音商业化战略运营&nbsp;base北京薪资&nbsp;n*15+签字费优点:-抖音业务成熟,平台认可度较高-战略的bar挺高,离老板比较近。-自己的长期职业发展不想一直在互联网做分析,想去vc,战略离vc挺近的。缺点:-起薪不太高,但hours很长。-做的是战略分析的事情,面试是战略分析的难度,但开的薪资和岗位title是运营,跳槽以后很难再去分析岗,或者向上去战略岗。-战略卷汇报多,个人不是特别喜欢看不到收益的岗位。-担心有一些pmo性质offer2:&nbsp;快手商分薪资:n*16优点:-是return所以对工作内容了解,工作内容很落地,可以拿好项目-电商业务核心,起薪高,开的价格让人无法拒绝缺点:-对平台的前景比较堪忧,对个人能力的提升担忧-给的工资太高了offer3:&nbsp;滴滴商家运营薪资:n*15优点:-国际化业务,增量比较大-英语为工作语言,出差机会多缺点:-薪资为几家中最低,且要跨时区沟通offer4:&nbsp;宝洁cbd薪资&nbsp;n*14优点:-做的是实打实的业务,很落地-和渠道打交道多,社会化的较快-轮岗机制,宝洁培训体系好,可以能力全面提升。缺点:-和过往经历太不一样,不认为自己擅长销售-销售背kpi,且之后很难转岗商分运营个人bg:加本top2经济,藤校统计硕士,三段互联网大厂实习,一段快消实习,主要想看未来发展,之后想做视频/短剧业务的商分or战投
点赞 评论 收藏
分享
我报的技术方向。之前刷题比较多所以编程题感觉还行,不过第三题还是很难的,最后没ac。选择题就比较懵了,前面好几道全是大模型相关的,什么SFT之类的,有的题选项看着都差不多,只能靠感觉选了。后面几道计算机基础的选择题的还好,正常八股文难度,应该没啥大问题。说一下编程题吧。第一题,给个区间问有多少个因子数量是奇数的数。这玩意就是个简单数论,以前刷题多的话一眼就能看出来,只有完全平方数的因子数量是奇数个,相当于求区间的完全平方数数量,直接秒了。第二题,超级斐波那契,前k项是1,后面每项是前k项的和。直接写暴力肯定超时,想了一下发现相邻两项做个差就能把求和消掉,这道题比较快也ac了。第三题是个图论,每个节点的权值是它当前的度数加上编号,然后支持删边和查询连通块最大权值。删边会导致度数发生变化,权值也会跟着变。这种删边问题很容易想到离线,把操作反过来,这样删边就变成加边了,可以直接用并查集来维护。不过这题估计是细节写挫了,最后wa了几个点没调出来,还是很寄的,考完不知道最后排名咋样。总体来说感觉还可以吧,感觉前一段时间刷牛客的公司真题挺有用的。我刚刚发现上周考的美团真题已经上了:https://www.nowcoder.com/exam/company?questionJobId=10&amp;subTabName=written_page&nbsp;,把第三题重新写了一下,最后ac了。感觉还是考场上紧张导致最后wa了。选择题这方面大家有没有学习的资料啊,感觉ai这些啥都不会啊,有没有大佬教教QWQ
查看3道真题和解析
点赞 评论 收藏
分享
评论
3
31
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务