📜  沃尔玛实验室面试经历|第 11 组(校内)(1)

📅  最后修改于: 2023-12-03 15:40:42.357000             🧑  作者: Mango

沃尔玛实验室面试经历|第 11 组(校内)

简介

本次沃尔玛实验室的面试是在学校内举行的。我们参加的是第 11 组面试。本次面试主要是围绕算法和数据结构展开的,题目难度适中,需要一定的算法基础和灵活运用能力。

面试内容
代码题
  1. 在一个数组中找到前 k 大的元素。

    • 要求时间复杂度为 O(n*logk)。
    • 解题思路:利用最小堆维护前 k 大元素,遍历数组,将每个元素依次与堆顶元素进行比较,如果大于堆顶元素,则将堆顶元素替换,并进行堆调整。最终堆中的元素即为前 k 大元素。
    • 代码片段:
    import heapq
    
    def find_top_k(arr, k):
    	heap = []
    	for i in arr:
    		if len(heap) < k:
    			heapq.heappush(heap, i)
    		else:
    			if i > heap[0]:
    				heapq.heappushpop(heap, i)
    	return heap
    
  2. 逆波兰表达式求值。

    • 要求支持加、减、乘、除四种符号。
    • 解题思路:利用栈来存储操作数,依次读入表达式中的每个符号,如果为操作符,则弹出栈顶的两个操作数,进行对应的运算,将结果压入栈中;如果为数字,则直接压入栈中。最终栈中剩下来的元素即为表达式的值。
    • 代码片段:
    def evaluate_expression(tokens):
    	stack = []
    	for token in tokens:
    		if token in ["+", "-", "*", "/"]:
    			op2 = stack.pop()
    			op1 = stack.pop()
    			if token == "+":
    				stack.append(op1 + op2)
    			elif token == "-":
    				stack.append(op1 - op2)
    			elif token == "*":
    				stack.append(op1 * op2)
    			else:
    				stack.append(op1 // op2)
    		else:
    			stack.append(int(token))
    	return stack.pop()
    
算法题
  1. 给定一个 n * n 的网格,每个格子上有一个数字,初始状态下,一个机器人位于左上角,现在需要将其移动到右下角,每次只能向下或向右移动一格,经过的格子的数字会被计入路径和。求路径和最大是多少。

    • 要求时间复杂度为 O(n^2)。
    • 解题思路:使用动态规划,定义一个 n * n 的状态数组 dp,其中 dp[i][j] 表示机器人从左上角走到格子 (i, j) 时经过的路径和的最大值。根据题意可知,机器人只能从上一格或左一格移动过来,因此机器人到达 dp[i][j] 时,其所走过的路径必定经过 dp[i-1][j] 或 dp[i][j-1]。故有 dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j]。
    • 代码片段:
    def max_path_sum(grid):
    	n = len(grid)
    	dp = [[0]*n for _ in range(n)]
    	dp[0][0] = grid[0][0]
    	for i in range(1, n):
    		dp[i][0] = dp[i-1][0] + grid[i][0]
    		dp[0][i] = dp[0][i-1] + grid[0][i]
    	for i in range(1, n):
    		for j in range(1, n):
    			dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + grid[i][j]
    	return dp[n-1][n-1]
    
  2. 设计一个支持最大值和最小值查询的栈。

    • 要求时间复杂度为 O(1)。
    • 解题思路:维护两个栈:一个正常的栈用来存储数据,另一个栈用来存储当前最大值和最小值。具体实现如下:
      • push(x):将元素 x 压入正常栈中,如果元素 x 大于等于栈顶元素,则将其也压入最大值栈中;如果元素 x 小于等于栈顶元素,则将其也压入最小值栈中。
      • pop():弹出正常栈的栈顶元素,并将其与最大值栈和最小值栈的栈顶元素进行比较,若相等,则将它们同时弹出。
      • get_max():返回最大值栈的栈顶元素。
      • get_min():返回最小值栈的栈顶元素。
    • 代码片段:
    class MaxMinStack:
    	def __init__(self):
    		self.stack = []
    		self.max_stack = []
    		self.min_stack = []
    
    	def push(self, x):
    		self.stack.append(x)
    		if not self.max_stack or x >= self.max_stack[-1]:
    			self.max_stack.append(x)
    		if not self.min_stack or x <= self.min_stack[-1]:
    			self.min_stack.append(x)
    
    	def pop(self):
    		x = self.stack.pop()
    		if self.max_stack and x == self.max_stack[-1]:
    			self.max_stack.pop()
    		if self.min_stack and x == self.min_stack[-1]:
    			self.min_stack.pop()
    
    	def get_max(self):
    		if self.max_stack:
    			return self.max_stack[-1]
    		return None
    
    	def get_min(self):
    		if self.min_stack:
    			return self.min_stack[-1]
    		return None
    

以上是本次沃尔玛实验室面试的具体内容和相关代码,希望对广大程序员们有所帮助!