美团2024届秋招(8.12)【后端&数开&软件方向】
1、输入数组array和目标数n1,n2,判断数组[n1,n2]或[n2,n1]是否在array中
题目是简单题,限制时间复杂度。使用字典存储array中的数和下标,再使用n1查看其下标偏移后是否对应n2的下标
_ = input()
strNums = input().split()
dictNums = {}
for idx in range(len(strNums)):
strCurNum = strNums[idx]
if strCurNum not in dictNums:
dictNums[strCurNum] = [idx]
dictNums[strCurNum].append(idx)
nNum = input().split()
nNum1 = nNum[0]
nNum2 = nNum[1]
bFlag = True
for idx in dictNums[nNum1]:
if idx + 1 in dictNums[nNum2] or idx - 1 in dictNums[nNum2]:
print("Yes")
bFlag = False
break
if bFlag:
print("No")
2、环形道路中,使用array记录从i至i+1的路程(最后一位表示重点到起点距离)。输入n1、n2,求之间的最短路程
数学题,看出来只用求一边就行
_ = input()
arrnDis = input().split()
arrnTarget = input().split()
nStart = int(arrnTarget[0]) - 1
nEnd = int(arrnTarget[1]) - 1
if (nStart > nEnd):
nStart, nEnd = nEnd, nStart
for idx in range(len(arrnDis)):
arrnDis[idx] = int(arrnDis[idx])
nDisSum = sum(arrnDis)
nResDis = sum(arrnDis[nStart:nEnd])
print(min(nResDis, nDisSum - nResDis))
3、输入二维数组Matrix,横向或纵向切成两部分,使两部分数组之和的差最小
统计横向和纵向的一维数组之和,然后求两个一维数组的前缀和数组,方便表示两个子矩阵地数组之和大小
nLineNum = input()
nLineNum = nLineNum.split()
nLineNum = int(nLineNum[0])
matNum = []
for _ in range(nLineNum):
arrstrCurLine = input()
arrstrCurLine = arrstrCurLine.split()
arrnCurLine = [int(x) for x in arrstrCurLine]
matNum.append(arrnCurLine)
arrnRowSum = [sum(x) for x in matNum]
arrnColSum = [sum(x) for x in zip(*matNum)]
for idx in range(1, len(arrnRowSum)):
arrnRowSum[idx] += arrnRowSum[idx - 1]
for idx in range(1, len(arrnColSum)):
arrnColSum[idx] += arrnColSum[idx - 1]
nRes = arrnRowSum[-1]
for idx in range(len(arrnRowSum)):
nRes = min(abs(arrnRowSum[-1] - 2 * arrnRowSum[idx - 1]), nRes)
for idx in range(len(arrnColSum)):
nRes = min(abs(arrnColSum[-1] - 2 * arrnColSum[idx - 1]), nRes)
print(nRes)
4、输入字符串,将字符串重新排列成矩阵。如果字符相同则视为“连通”的,求重新排列后,最小连通块数量
例如aaaaabbbb可以重新排列成三行三列aaa aab bbb,可以看到只有左上角a和右下角b两个连通区域,所以结果是2。同理。caab不用重排,结果是3。
暴力,感觉题目对时间限制不严格。
nNum = int(input())
strStr = input()
def Visit(nRow, nCol, strStr, arrbVisited, nCurRow, nCurCol, cCurChar):
nCurIdx = nCurRow * nCol + nCurCol
if nCurRow < 0 or nCurRow >= nRow or nCurCol < 0 or nCurCol >= nCol or arrbVisited[nCurIdx] == True or strStr[nCurIdx] != cCurChar:
return
arrbVisited[nCurIdx] = True
Visit(nRow, nCol, strStr, arrbVisited, nCurRow + 1, nCurCol, cCurChar)
Visit(nRow, nCol, strStr, arrbVisited, nCurRow - 1, nCurCol, cCurChar)
Visit(nRow, nCol, strStr, arrbVisited, nCurRow, nCurCol + 1, cCurChar)
Visit(nRow, nCol, strStr, arrbVisited, nCurRow, nCurCol - 1, cCurChar)
def CountValue(strStr, arrbVisited, nRow, nCol):
nCount = 0
for nIdx in range(len(arrbVisited)):
if arrbVisited[nIdx] == False:
cCurChar = strStr[nIdx]
Visit(nRow, nCol, strStr, arrbVisited, nIdx // nCol, nIdx % nCol, cCurChar)
nCount += 1
return nCount
nRes = nNum
for nRow in range(1, nNum):
nCol = nNum / nRow
if nCol != int(nCol):
continue
arrbVisited = [False] * nNum
nRes = min(nRes, CountValue(strStr, arrbVisited, nRow, int(nCol)))
print(nRes)
5、给出一棵树,每个节点包含权重和颜色。初始时刻所有节点为白色。若两个节点的颜色均为白色,且权重之和恰为完全平方数,则可以同时染为红色。问至多可使几个节点染色。
输入样例:
8 # 节点数 4 16 16 4 3 4 3 3 # 节点权重 1 2 # 第1个节点和第2个节点相连 1 3 # 第1个节点和第3个节点相连 2 4 2 5 3 6 3 7 7 8
输出样例:6。即染色节点(下标从1开始)为(2、4)(1、3)(7、8)
暴力dfs,需要分别考虑当前节点被染色和当前节点不被染色两种情况。由于两种情况都考虑,所以遍历至某一结点时,当前节点内容和此前节点无关(注意不要回溯循环就行,因为题目说了是树,只要记录从哪一个节点遍历至当前节点从而避免循环就行),所以递归求解就行。
递归公式求以下两种情况最大值:
1、当前节点CurNode不和任何连通节点NextNode染色,对NextNode递归后结果之和
2、当前节点CurNode与某一节点NextColoredNode染色,同时其他节点NextUncoloredNode不染色,对NextColoredNode和NextUncoloredNode递归后结果之和
nNodeNum = int(input())
arrnValue = input().split()
arrnValue = [int(i) for i in arrnValue]
listlistnAdjust = [[] for i in range(len(arrnValue))]
arrbColored = [False] * nNodeNum
for _ in range(nNodeNum - 1):
strCurInput = input().split()
listlistnAdjust[int(strCurInput[0]) - 1].append(int(strCurInput[1]) - 1)
listlistnAdjust[int(strCurInput[1]) - 1].append(int(strCurInput[0]) - 1)
def issut(value1, value2):
res = (value1 * value2) ** 0.5
if res == int(res):
return True
else :
return False
def color(listlistnAdjust, arrnValue, arrbColored, nCurNodeIdx, nPreNodeIdx):
if nCurNodeIdx == nPreNodeIdx:
return 0
nRes = 0
arrnNextNodeIdx = listlistnAdjust[nCurNodeIdx]
arrnSutRes = [0 for _ in range(len(arrnNextNodeIdx))]
arrnRes = [0 for _ in range(len(arrnNextNodeIdx))]
for idx in range(len(arrnNextNodeIdx)):
nNextNodeIdx = arrnNextNodeIdx[idx]
if nPreNodeIdx == nNextNodeIdx:
continue
if arrbColored[nNextNodeIdx] == False and arrbColored[nCurNodeIdx] == False and issut(arrnValue[nNextNodeIdx], arrnValue[nCurNodeIdx]) :
arrbColored[nNextNodeIdx] = True
arrbColored[nCurNodeIdx] = True
arrnSutRes[idx] = 2 + color(listlistnAdjust, arrnValue, arrbColored, nNextNodeIdx, nCurNodeIdx)
arrbColored[nNextNodeIdx] = False
arrbColored[nCurNodeIdx] = False
arrnRes[idx] = color(listlistnAdjust, arrnValue, arrbColored, nNextNodeIdx, nCurNodeIdx)
nSumRes = sum(arrnRes)
for idx in range(len(arrnSutRes)):
nRes = max(nSumRes - arrnRes[idx] + arrnSutRes[idx], nRes)
return nRes
print(color(listlistnAdjust, arrnValue, arrbColored, 0, -1))
#美团2024秋招#