vivo笔试 vivo笔试题 0913

笔试时间:2024年09月13日 秋招

历史笔试传送门:2023秋招笔试合集

第一题

题目

vivo项目组新老员工分组完成任务员工数组staff,其中0表示新员工,1表示老员工分组规则如下:1、一个小组至多3个员工2、一个小组中最多有1个老员工3、如果一个小组中有1个老员工,那么这组最多有2个员工,求最小的分组数。

输入描述

输入员工数组 staff,元素只包含0,1。

输出描述

输出一个整数,表示最小分组数。

样例输入一

[1,0,0,0,1]

样例输出一

3

样例输入二

[1,1]

样例输出二

2

参考题解

模拟。遍历员工数组:根据规则进行分组。如果遇到一个老员工 (1),需要开始一个新组。如果遇到两个新员工 (0),它们可以被加入到一个已有的组,或者形成一个新的组。一旦满足组内有一个老员工且组最大人数为2的情况,或者只有新员工且数量达到3的情况,形成一个新的组。统计数最小的分组数。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <vector>

int minimumGroups(const std::vector<int>& staff) {
    int n = staff.size();
    int groups = 0;
    int i = 0;

    while (i < n) {
        if (staff[i] == 1) {  // 老员工情况
            groups++;  // 老员工自己成组
            if (i + 1 < n && staff[i + 1] == 0) {  // 检查下一个是否为新员工
                i += 2;  // 老员工和一个新员工成组
            } else {
                i++;  // 老员工单独成组
            }
        } else {  // 新员工情况
            int count = 0;
            while (i < n && staff[i] == 0 && count < 3) {  // 最多3个新员工成组
                i++;
                count++;
            }
            groups++;  // 新员工成组
        }
    }

    return groups;
}

Java:[此代码未进行大量数据的测试,仅供参考]

public static int minimumGroups(int[] staff) {
        int n = staff.length;
        int groups = 0;
        int i = 0;

        while (i < n) {
            if (staff[i] == 1) {  // 老员工情况
                groups++;  // 老员工自己成组
                if (i + 1 < n && staff[i + 1] == 0) {  // 检查下一个是否为新员工
                    i += 2;  // 老员工和一个新员工成组
                } else {
                    i++;  // 老员工单独成组
                }
            } else {  // 新员工情况
                int count = 0;
                while (i < n && staff[i] == 0 && count < 3) {  // 最多3个新员工成组
                    i++;
                    count++;
                }
                groups++;  // 新员工成组
            }
        }

        return groups;
}

Python:[此代码未进行大量数据的测试,仅供参考]

def minimumGroups(staff):
    n = len(staff)
    groups = 0
    i = 0

    while i < n:
        if staff[i] == 1:  # 老员工情况
            groups += 1  # 老员工自己成组
            if i + 1 < n and staff[i + 1] == 0:  # 检查下一个是否为新员工
                i += 2  # 老员工和一个新员工成组
            else:
                i += 1  # 老员工单独成组
        else:  # 新员工情况
            count = 0
            while i < n and staff[i] == 0 and count < 3:  # 最多3个新员工成组
                i += 1
                count += 1
            groups += 1  # 新员工成组

    return groups

第二题

题目

你是一名手机应用开发工程师,需要分析应用在手机上的内存使用情况。你有一个数组 memoryUsage,其中 memoryUsage[i]表示应用在第 i秒的内存使用量(以MB为单位)。为了评估应用的稳定性,你需要找出每个连续 k秒内的内存使用量的波动范围(即最大值与最小值的差值),并返回这些波动范围。

样例输入一

[120,150,110,180,130,160,140,170],3

样例输出一

[40,70,70,50,30,30]

样例输入二

[80,100,70,90,60,85,75, 95, 110],4

样例输出二

[30,40,30,30,35,35]

参考题解

滑动窗口。滑动窗口:使用两个双端队列(Deque)分别维护当前窗口的最大值和最小值。最大值队列:从左到右存储当前窗口的降序元素(最大值在最前面)。最小值队列:从左到右存储当前窗口的升序元素(最小值在最前面)。2、遍历数组:对于每个新元素,移除队列中已经不在窗口范围内的元素。更新两个队列,确保队列中的元素保持排序。当窗口大小达到 k 时,计算最大值与最小值的差值,并存储到结果数组中。

C++:[此代码未进行大量数据的测试,仅供参考]

#include <vector>
#include <deque>

std::vector<int> memoryFluctuations(const std::vector<int>& memoryUsage, int k) {
    int n = memoryUsage.size();
    if (n == 0 || k <= 0 || k > n) return {};

    std::vector<int> result(n - k + 1);
    std::deque<int> maxDeque;
    std::deque<int> minDeque;

    for (int i = 0; i < n; i++) {
        // 移除不在当前窗口范围内的元素
        if (!maxDeque.empty() && maxDeque.front() < i - k + 1) maxDeque.pop_front();
        if (!minDeque.empty() && minDeque.front() < i - k + 1) minDeque.pop_front();

        // 维护最大值队列
        while (!maxDeque.empty() && memoryUsage[maxDeque.back()] <= memoryUsage[i]) maxDeque.pop_back();
        maxDeque.push_back(i);

        // 维护最小值队列
        while (!minDeque.empty() && memoryUsage[minDeque.back()] >= memoryUsage[i]) minDeque.pop_back();
        minDeque.push_back(i);

        // 计算当前窗口的最大最小值的差值
        if (i >= k - 1) {
            int maxVal = memoryUsage[maxDeque.front()];
            int minVal = memoryUsage[minDeque.front()];
            result[i - k + 1] = maxVal - minVal;
        }
    }

    return result;
}

Java:[此代码未进行大量数据的测试,仅供参考]

public static int[] memoryFluctuations(int[] memoryUsage, int k) {
        int n = memoryUsage.length;
        if (n == 0 || k <= 0 || k > n) return new int[0];

        int[] result = new int[n - k + 1];
        Deque<Integer> maxDeque = new ArrayDeque<>();
        Deque<Integer> minDeque = new ArrayDeque<>();

        for (int i = 0; i < n; 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

鸿雁于飞:1. 求职定位乱成一锅粥,直接劝退HR 你期望职位同时写了「项目经理/技术经理/交付经理」,这仨岗根本不是一个赛道!项目经理玩流程和干系人,技术经理玩架构和带技术团队,交付经理玩客户和回款,你仨全堆上,HR直接判定「这人自己都不知道自己要干啥,没核心竞争力」,直接扔简历。 ​ 2. 2年多的职业空窗期,一个字不提,纯纯自杀行为 金融行业最看重职业连贯性和背景干净,你2018年5月到2020年8月,整整2年3个月没上班,啥说明都没有!HR直接脑补你是不是有竞业限制、是不是创业失败、是不是有啥背调过不了的问题,直接不敢往下看,首轮就给你筛了,这是最致命的坑! ​ 3. 工作经历纯纯摆烂,干货全藏起来了 你每段工作就写个公司、职位、时间,干了啥、带了多大团队、出了啥核心成果、给公司赚了/省了多少钱,一个字没有,全堆到后面的项目里了。HR看简历就3秒,第一眼看不到你每段工作的价值,直接就划走了,根本不会翻你后面的项目。 ​ 4. 项目经验像个大杂烩,还全是bug 你堆了快10个项目,银行、证券、公安、政务、日本项目啥都有,跟个杂货铺一样,HR根本看不到你的核心优势在哪。而且项目连个起止时间都不写,谁知道你这是最近的标杆项目,还是10年前刚入行干的活?还有数据前后矛盾,一会说「零事故交付」,一会说「生产事故率降低50%」,HR一看就觉得你瞎包装,根本不信。 ​ 5. 15年经验的经理岗,还在写一线拧螺丝的活,层级完全错配 你都应聘经理级岗位了,简历里还在写自己写接口、写测试脚本、做前端开发这些一线执行的活,完全没写你怎么搭建管理体系、怎么带团队、怎么搞定甲方、怎么控项目风险、怎么拿经营结果,MBA的价值一点没体现出来。HR看完直接觉得:合着你干了15年,还是个高级开发,根本达不到经理岗的要求,直接pass。 ​ 6. AI风口完全没抓住,写了句空话等于没写 现在全行业都在卷AI+金融,人家招管理岗,都要能落地AI场景的人。你就写了句「深化Transformer与大模型底层技术研习」,纯纯空话,一点实际落地成果都没有,跟其他候选人比,完全没差异化优势,人家凭啥放着年轻能落地的不要,要你这个只学了理论的? 姐好好看看,然后改改简历吧,要专,要精,然后降低求职目标。希望你能早日拿到offer
点赞 评论 收藏
分享
评论
2
19
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务