vivo笔试 vivo秋招 vivo笔试题 0912
笔试时间:2025年9月12日
往年笔试合集:
第一题
题目:你正在参与股票交易,但需遵守以下规则:
- 每次卖出股票后,必须经过k天(不包括卖出当天)的冷却期才能再次买入
- 最多只能持有一股股票
- 可以多次交易,但每次交易(买入和卖出)必须完整
- 给定股票每日价格数组prices和冷却天数k,求你能获得的最大利润
输入描述
- 输入价格数组:prices = [x,y,z,u,v,w],每个元素代表每天的价格
- 冷却天数:k
输出描述
能获得的最大利润(int)
样例输入
[1, 3, 5, 2, 6, 4], 1
样例输出
6
参考题解
解题思路:使用动态规划,定义两个状态:
- dp[i][0]:第i天不持有股票的最大利润
- dp[i][1]:第i天持有股票的最大利润 考虑冷却期k的约束,买入时需要从k+1天前的不持有状态转移
C++:
class Solution { public: int maxProfit(vector<int>& prices, int k) { int n = prices.size(); if (n <= 1) return 0; vector<vector<int>> dp(n, vector<int>(2)); dp[0][0] = 0; dp[0][1] = -prices[0]; for (int i = 1; i < n; i++) { dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]); if (i - k - 1 < 0) { dp[i][1] = max(dp[i-1][1], -prices[i]); } else { dp[i][1] = max(dp[i-1][1], dp[i - k - 1][0] - prices[i]); } } return dp[n-1][0]; } };
Java:
public class Solution { public int maxProfit(int[] prices, int k) { int n = prices.length; if (n <= 1) return 0; int[][] dp = new int[n][2]; dp[0][0] = 0; dp[0][1] = -prices[0]; for (int i = 1; i < n; i++) { dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] + prices[i]); if (i - k - 1 < 0) { dp[i][1] = Math.max(dp[i-1][1], -prices[i]); } else { dp[i][1] = Math.max(dp[i-1][1], dp[i - k - 1][0] - prices[i]); } } return dp[n-1][0]; } }
Python:
class Solution: def maxProfit(self, prices: List[int], k: int) -> int: n = len(prices) if n <= 1: return 0 dp = [[0, 0] for _ in range(n)] dp[0][0] = 0 dp[0][1] = -prices[0] for i in range(1, n): dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]) if i - k - 1 < 0: dp[i][1] = max(dp[i-1][1], -prices[i]) else: dp[i][1] = max(dp[i-1][1], dp[i - k - 1][0] - prices[i]) return dp[n-1][0]
第二题
某公司发布了两款新产品,在旗舰店开放了新品体验活动。需要开发一个智能排队系统的核心算法,精确预估一位同时预约了两款产品的消费者所需花费的总时间。
系统规则:
- 动态优先级排序(三级规则): 第一优先级:预约优先级(1-10,数字越小优先级越高)第二优先级:预计体验时间(时间越短优先级越高)第三优先级:预约次序(序号越小优先级越高)
- 过号处理规则:未到达时视为过号,需等待当前及后续两位消费者完成
- 跨区体验逻辑:优先去最先轮到的体验区
输入描述
- queueA:二维整数数组,A产品体验区排队信息,每个子数组[priority, duration]
- queueB:格式同queueA,B产品体验区排队信息
- targetConsumerIds:长度为2的数组[id_a, id_b],目标消费者在两个队列中的索引
输出描述
一个整数,表示目标消费者完成所有体验所需的总时间
样例输入
[[2,10]], [[3,15]], [0,0]
样例输出
25
参考题解
解题思路:通过事件驱动模拟,跟踪每个体验区和消费者状态,根据优先级规则动态选择下一个消费者,处理过号情况,计算目标消费者完成两个体验的总时间。
Java:
import java.util.*; public class Solution { public int calculateTotalTime(int[][] queueA, int[][] queueB, int[] targetConsumerIds) { int n = queueA.length; int[] priorityA = new int[n]; int[] durationA = new int[n]; int[] priorityB = new int[n]; int[] durationB = new int[n]; for (int i = 0; i < n; i++) { priorityA[i] = queueA[i][0]; durationA[i] = queueA[i][1]; priorityB[i] = queueB[i][0]; durationB[i] = queueB[i][1]; } int targetA = targetConsumerIds[0]; int targetB = targetConsumerIds[1]; int[] startA = new int[n]; int[] endA = new int[n]; int[] startB = new int[n]; int[] endB = new int[n]; Arrays.fill(startA, -1); Arrays.fill(startB, -1); Arrays.fill(endA, -1); Arrays.fill(endB, -1); boolean[] doneA = new boolean[n]; boolean[] doneB = new boolean[n]; boolean[] arrivedA = new boolean[n]; boolean[] arrivedB = new boolean[n]; Arrays.fill(arrivedA, true); Arrays.fill(arrivedB, true); int[] waitCountA = new int[n]; int[] waitCountB = new int[n]; int currentTimeA = 0; int currentTimeB = 0; int currentConsumerA = -1; int currentConsumerB = -1; int endTimeA = -1; int endTimeB = -1; while (!doneA[targetA] || !doneB[targetB]) { if (currentConsumerA == -1 || currentTimeA >= endTimeA) { if (currentConsumerA != -1) { int consumer = currentConsumerA; endA[consumer] = endTimeA; doneA[consumer] = true; arrivedB[consumer] = true; if (startB[consumer] != -1 && startB[consumer] < endTimeA) { waitCountB[consumer] = 3; } currentC
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025 春招笔试合集 文章被收录于专栏
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南