Bilibili暑期实习笔试

两道题。一道思维,一道二分。(第一个是力扣那种写函数的题)

  1. 给一个数组,将其划分成个子数组(不需要连续)。问每个子数组极差的和最大是多少。

Code:

int solution(vector<int> nums, int k) {
    int n = nums.size();
    sort(nums.begin(), nums.end());
    int res = 0;
    for (int i = 1; i <= min(k, n - k); ++i) res += nums[n - i] - nums[i - 1];
    return res;
}
  1. 一共有个苹果,个小孩,这些小孩排成一排,小明是第个小孩(下标从1开始)。给每个人分配苹果,每个小孩至少分一个苹果,相邻的小孩分配的苹果数量差不能超过1。问小明最多能分到多少个苹果。

Code:

#include <bits/stdc++.h>

using namespace std;

#define LL long long

bool ok(LL x, LL k, LL n, LL m) {
    LL mx = (x + 1 + x + n - k) * (n - k) / 2 + x + (x + 1 + x + k - 1) * (k - 1) / 2;
    if (mx < m) return false;
    LL mi = x;
    if (x - (n - k) >= 1) mi += (x - 1 + x - (n - k)) * (n - k) / 2;
    else mi += (x - 1 + 1) * (x - 1) / 2 + n - k - (x - 1);
    if (x - (k - 1) >= 1) mi += (x - 1 + x - (k - 1)) * (k - 1) / 2;
    else mi += (x - 1 + 1) * (x - 1) / 2 + k - 1 - (x - 1);
    return mi <= m;
}

int solution(int n, int m, int k) {
    if (n == 1) return m;
    LL l = 1, r = m, f = -1;
    while (l <= r) {
        LL mid = (l + r) >> 1;
        if (ok(mid, k, n, m)) {
            f = mid;
            l = mid + 1;
        }
        else r = mid - 1;
    }
    return f;
}
int main() {
    int n, m, k;
    cin >> n >> m >> k;
    cout << solution(n, m, k) << endl;
    return 0;
}
#bilibili笔试#
全部评论
大佬 有收到面试通知吗
点赞 回复 分享
发布于 03-27 12:38 湖北

相关推荐

拼多多&nbsp;暑期实习&nbsp;二面,总共用时1h&nbsp;左右,&nbsp;被面试官疯狂拷打,&nbsp;估计凉凉。首先介绍项目,&nbsp;对方完全不感兴趣:&nbsp;你做的这些和后端开发有什么关系?我简单介绍了下后端相关的,面试官可能觉得太简单了,没有继续问。然后就是痛苦的手撕拷打,持续50mins&nbsp;左右。问题1:&nbsp;给你两个班级,&nbsp;每个班级共有&nbsp;k&nbsp;个人,你是班主任,要从每个班级中挑出1个人,使得他们的身高差最小。回答:&nbsp;先排序,&nbsp;然后遍历A班级,二分查找B班级中的第一个大于等于(lower_bound)A班级里的那个&nbsp;的位置,然后比较那个位置和前一个位置。面试官和我不太同频,问我为什么要找第一个大于等于?二分查找不就是找一个位置吗?&nbsp;面试官笑眯眯的问我是第一次接触二分搜索吗?然后计算时间复杂度。感觉完全不同频。问还有更优解法吗?回答双指针,还是固定遍历A,&nbsp;然后另一个指针从B开始找比A大的,然后在和前一个也比较,取最小的。这样就是O(n).面试官提示一下,不要局限在当前这个和前一个比较,换种思路。 然后我一直在思考,对方问我双指针要怎么初始化?&nbsp;&nbsp;因为我还没想好,就没回答。面试官:&nbsp;双指针要怎么初始化?这你都不懂吗。。。?&nbsp;怎么不回答我。我说新思路还没想好,面试官表示刚才那种思路的双指针要怎么初始化?&nbsp;答:都初始化在第一个位置。问题2:&nbsp;两个班级,&nbsp;换成&nbsp;N&nbsp;个班级,&nbsp;每个班级选1个人,&nbsp;要求算出来的人里的&nbsp;max&nbsp;-&nbsp;min&nbsp;最小。答没思路,&nbsp;面试官提示下多个指针?&nbsp;考虑下指针应该如何移动。我想了想,移动最小的那个指针,直到所有指针都走到末尾,每次移动,从这个N个人里面取最大的,最小的,比较。然后算时间复杂度:n个班,每个班k个人,&nbsp;&nbsp;我想整体的数据规模是&nbsp;N&nbsp;=&nbsp;n*k&nbsp;,&nbsp;然后我用&nbsp;N&nbsp;去后续表示。面试官:你为什要定义新的符号N? 算完时间复杂度,问我“从这个N个人里面取最大的,最小的”这部分可以优化吗? 我回答可以使用&nbsp;map&nbsp;(cpp里的),面试官表示你直接说数据结构,不要说语言中的名字。问这个的时间复杂度,答logn面试官:那你开始写吧。写了大概&nbsp;3&nbsp;分钟。&nbsp;他看了眼。问题3:&nbsp;ping&nbsp;100ms&nbsp;&nbsp;,&nbsp;curl&nbsp;http://1.2.3.4:8080/hello&nbsp;&nbsp;需要多少时间?这里我考虑了4次挥手,&nbsp;面试官:需要考虑这个吗?答&nbsp;200ms.&nbsp;问题4:&nbsp;直播间,打赏金额最高的100个用户?&nbsp;你应该如何实现维护?我回答使用&nbsp;redis&nbsp;的&nbsp;zset&nbsp;,&nbsp;&nbsp;可以高效的获取top&nbsp;100.面试官问:这样有什么问题吗?&nbsp;如果用户特别多的情况。我想了一会,也没想出什么问题,回答没什么思路。面试官:用户太多了会有&nbsp;大&nbsp;key&nbsp;问题,&nbsp;zset&nbsp;删除的时候会阻塞几秒。&nbsp;(我不太理解)面试官:你应该考虑怎么优化?答:&nbsp;string&nbsp;配合&nbsp;zset&nbsp;使用,&nbsp;string&nbsp;kv&nbsp;中存&nbsp;user,&nbsp;money,&nbsp;&nbsp;而&nbsp;zset&nbsp;中只维护&nbsp;top&nbsp;100&nbsp;的。同时更新这俩。最后,&nbsp;反问部门业务:拼多多直播带货。技术栈:&nbsp;面试官看我的简历里面,cpp&nbsp;太底层了我们这边不用,golang&nbsp;也不用,主要是&nbsp;java&nbsp;,&nbsp;然后&nbsp;redis,&nbsp;mysql,&nbsp;kafka这些。面试官问我懂不懂二分,&nbsp;我当时多少有点生气💢,&nbsp;不过总的来说面试官人还不错,还算友善,给了很多引导。
查看13道真题和解析 牛客创作赏金赛
点赞 评论 收藏
分享
评论
3
8
分享

创作者周榜

更多
牛客网
牛客企业服务