春招第五次算法笔试--开心消消乐 服务端开发岗
一共四道算法题,完成两道,还有一道最后1s发现问题,但已经来不及了,最后一道没看
1.不难,算两个数组范围的最大交叉部分
# 计算紫色最大连续长度
# @param redSegments Interval类一维数组 小狐狸每次涂色的起始和结束位置
# @param blueSegments Interval类一维数组 小河马每次涂色的起始和结束位置
# @return int整型
#
from typing import List
class Interval:
def __init__(self, a=0, b=0):
self.start = a
self.end = b
def printf(self):
print(f"start={self.start}, end={self.end}")
class Solution:
def GetMaxPurpleLength(self , redSegments: List[Interval], blueSegments: List[Interval]) -> int:
def list_to_set(Segments: List[Interval]):
# 将像 [2, 4] 的范围转化为 {2,3} 的集合
segment_set = set()
for segment in Segments:
# segment.printf()
for i in range(segment.start, segment.end):
segment_set.add(i)
return segment_set
red_set = list_to_set(redSegments)
blue_set = list_to_set(blueSegments)
in_red_and_blue = []
for i in red_set:
if i in blue_set:
in_red_and_blue.append(i)
in_red_and_blue.sort()
last = 0
now_num = 0
max_num = 0
# print(in_red_and_blue)
for i in in_red_and_blue:
if i - 1 == last:
last = i
now_num += 1
# print("add", last, i, now_num, max_num)
else:
if now_num > max_num:
max_num = now_num
last = i
now_num = 1
# print("put", last, i, now_num, max_num)
if now_num > max_num:
max_num = now_num
return max_num
if __name__=="__main__":
red = [[2,5],[5,11]]
blue = [[2,7], [16,115]]
redSegments = []
for ll in red:
redSegments.append(Interval(*ll))
blueSegments = []
for ll in blue:
blueSegments.append(Interval(*ll))
re = Solution().GetMaxPurpleLength(redSegments=redSegments, blueSegments=blueSegments)
print(re)
2.计算各个数位上的数字均不同的整数个数,转换思路,每次算1位数,2位数.. ,相当于计算 C(9,1)*A(9,n-1)
# 统计各个数位上的数字均不同的整数个数
# @param n int整型 十进制n位数
# @return int整型
#
class Solution:
def answer(self , n ):
def get_the_k(k):
if k == 0:
return 1
elif k == 1:
return 9
A = 1
num = 9
for _ in range(k-1):
A *= num
num -= 1
return 9 * A
sum = 0
n = min(n, 10)
for i in range(n+1):
sum += get_the_k(i)
# print(i, get_the_k(i))
return sum
if __name__=="__main__":
re = Solution().answer(4)
print(re)
3.这题有点可惜,一开始没注意需要索引,而且索引是从1开始的,这两个细节导致我全错了
没注意需要索引,一开始就把myOptions排序了
没注意到索引是从1开始的,导致我使用枚举,结果都小了1
from typing import List
class Solution:
def helpMeWin(self , bossDamages: List[int], myOptions: List[List[int]]) -> List[int]:
# write code here
bossDamages.sort()
for ll in myOptions:
ll.sort()
def jisaun(options:list):
blue = 0
for i in bossDamages:
for j in options:
if j >= i:
blue += j
break
return blue
def can_use(options:list):
if options[-1] >= bossDamages[-1]:
return True
return False
can_use_options = []
for options in myOptions:
if can_use(options):
can_use_options.append(options)
if len(can_use_options) == 0:
return []
min_blue = 10000
min_index = []
for index, options in enumerate(myOptions):
if not can_use(options):
continue
# print(index, options)
blue = jisaun(options)
# print(blue)
if blue == min_blue:
min_index.append(index+1)
# print(min_blue, min_index)
if blue < min_blue:
min_index = [index+1]
min_blue = blue
# print(min_blue, min_index)
return min_index
if __name__ =="__main__":
bossDamages = [8,12,9]
myOptions = [[8,14],[9,13]]
re = Solution().helpMeWin(bossDamages=bossDamages, myOptions=myOptions)
print(re)
25年春招笔试面试记录 文章被收录于专栏
记录一下春招的笔面试
查看29道真题和解析