秋招日寄|vivo2025届秋招软件类笔试试卷
仅此一轮,题目都一样的,很简单。
第一题:单选题×6;
第二题:不定向选择×4;
第三题:编程题×3,核心代码模式。
编程题1:
项目组新老员工分组完成任务,员工数组staff,其中0表示新员工,1表示老员工,分组规则如下: 1、一个小组至多3个员工; 2、一个小组中最多有1个老员工; 3、如果一个小组中有1个老员工,那么这组最多有2个员工; 求最小的分组数。 输入描述: 输入员工数组 staff,元素只包含0,1; 输出描述: 输出一个整数,表示最小分组数。 示例输入: [1,0,0,0,1] 输出: 3 示例输入: [1,1] 输出: 2
答案:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 获取最小分组数
* @param staff int整型vector 员工数组,其中0表示新员工,1表示老员工
* @return int整型
*/
int staffGroup(vector<int>& staff) {
// write code here
int newstaff = 0;
int oldstaff = 0;
for (int a : staff) {
if (a == 0) newstaff++;
else oldstaff++;
}
int count = 0;
while (newstaff > 0 || oldstaff > 0) {
if (oldstaff > 0) {
oldstaff--;
if (newstaff > 0) newstaff--;
count++;
}
else {
count++;
if (newstaff >= 0) newstaff -= 3;
}
}
return count;
}
};
编程题2:
你是一名手机应用开发工程师,需要分析应用在手机上的内存使用情况。你有一个数组 memoryUsage,其中 memoryUsage[i]表示应用在第i秒的内存使用量(以MB为单位)。为了评估应用的稳定性,你需要找出每个连续k秒内的内存使用量的波动范围(即最大值与最小值的差值),并返回这些波动范围。 输入: [80, 100, 70, 90, 60, 85, 75, 95, 110],4 输出: [30,40,30,30,35,35] 输入: [120, 150, 110, 180, 130, 160, 140, 170],3 输出: [40,70,70,50,30,30]
答案:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可。
*
* @param memoryUsage int 整型 vector,数组 memoryUsage,其中 memoryUsage[i] 表示应用在第 i 秒的内存使用量(以 MB 为单位)。
* @param k int 整型,整数 k。
* @return int 整型 vector。
*/
vector<int> findFluctuations(vector<int>& memoryUsage, int k) {
// write code here
vector<int> result;
deque<int> minDeque;
deque<int> maxDeque;
for (int i = 0; i < memoryUsage.size(); i++) {
while (!minDeque.empty() && memoryUsage[minDeque.back()] >= memoryUsage[i]) minDeque.pop_back();
minDeque.push_back(i);
while (!maxDeque.empty() && memoryUsage[maxDeque.back()] <= memoryUsage[i]) maxDeque.pop_back();
maxDeque.push_back(i);
if (i >= k - 1) {
result.push_back(memoryUsage[maxDeque.front()] - memoryUsage[minDeque.front()]);
if (minDeque.front() <= i - k + 1) minDeque.pop_front();
if (maxDeque.front() <= i - k + 1) maxDeque.pop_front();
}
}
return result;
}
};
编程题3:
(限制语言为C、Java、Python)
为回馈粉丝,进行礼品派发活动,不同礼品价格不同,为公平起见,需要将全部的礼品公平的分配到粉丝手中,且每位粉丝拿到的礼品总价格相同。请帮忙确认以下的礼品数量和价格是否可以满足公平的分配原则,可以则返回true,否则返回false。 例如: 价格分别为5,4,1,3,2,3,2的礼物是否可以公平分配到4名粉丝手?答案是可以的,按(5)、(2,3)、(2,3)、(1,4)组合,第一位粉丝分配到价格为5的礼物,第二位分配到价格为2和3的礼物,第三位分配到价格为2和3的礼物,第四位分配到价格为1和4的礼物,全部礼物分配完,最后返回true,代表可以公平分配。 程序需要输入的参数是价格数组和粉丝人数(数组元素和粉丝人数均小于1000) 示例输入: [5,4,1,3,2,3,2],4 输出: true 输入: [1,2,2,2,2],3 输出: false
答案:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param prices int整型一维数组 礼物的价格
* @param pricesLen int prices数组长度
* @param k int整型 粉丝人数
* @return bool布尔型
*/
int cmp(const void* a, const void* b) {
return *(int*)b - *(int*)a;
}
bool canPartition(int* prices, int pricesLen, int* subsets, int k, int target, int idx) {
if (idx == pricesLen) return true;
for (int i = 0; i < k; i++) {
if (subsets[i] + prices[idx] <= target) {
subsets[i] += prices[idx];
if (canPartition(prices, pricesLen, subsets, k, target, idx + 1)) {
return true;
}
subsets[i] -= prices[idx];
}
if (subsets[i] == 0) break;
}
return false;
}
bool canEqualDistribution(int* prices, int pricesLen, int k) {
int sum = 0;
for (int i = 0; i < pricesLen; i++) {
sum += prices[i];
}
if (sum % k != 0) return false;
int target = sum / k;
qsort(prices, pricesLen, sizeof(int), cmp);
if (prices[0] > target) return false;
int subsets[k];
for (int i = 0; i < k; i++) {
subsets[i] = 0;
}
return canPartition(prices, pricesLen, subsets, k, target, 0);
}
#通信硬件人笔面经互助#SAGIMA笔面经整理 文章被收录于专栏
本人在秋招过程中的一些笔试和面经,尽可能的结构化、系统化的整理了,有些细节可能记不太清,大家可以随便提问,肯定知无不言言无不尽!


