【每日算法Day 100】字节跳动 AI Lab 面试编程题(三道)

简介: 【每日算法Day 100】字节跳动 AI Lab 面试编程题(三道)

今天连着面了两次字节跳动,勉强撑到了明天三面。一共三道编程题,做的很烂,这里分享一下。

第一题

给出一条长度为 L 的线段,除了头和尾两个点以外,上面还有 n 个整数点,需要在上面再放 k 个新的点,使得相邻的两个点之间的最大距离最小,求这个最小的距离。

题解

我当时太紧张了,真是脑抽了,还想着弄个优先队列,划分最大的,然后丢进去,再划分最大的,但是是错的。

正确解法小姐姐走了我才想起来,二分答案 m ,然后扫描一遍判断将每一段划分成小于等于 m 的一共需要多少次。如果次数大于 k ,说明 m 太短了,否则说明 m 太长了。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int L, n, k;
    scanf("%d%d%d", &L, &n, &k);
    vector<int> a(n+2, 0);
    a[0] = 1;
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
    }
    a[n+1] = L;
    int l = 1, r = L-1;
    while (l < r) {
        int m = l + (r - l) / 2;
        int cnt = 0;
        for (int i = 1; i <= n+1; ++i) {
            cnt += (a[i] - a[i-1] - 1) / m;
        }
        if (cnt > k) l = m + 1;
        else r = m;
    }
    cout << l << endl;
    return 0;
}

第二题

给出一个数组 A,找到最大的 A[i] - A[j],要求 i > j

题解

这题很简单,直接遍历每个 A[i],维护它前面最小的那个数 minn,然后求出最大的 A[i] - minn 就行了。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n;
    scanf("%d", &n);
    vector<int> a(n, 0);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
    int minn = a[0], res = INT_MIN;
    for (int i = 1; i < n; ++i) {
        res = max(res, a[i]-minn);
        minn = min(minn, a[i]);
    }
    cout << res << endl;
}

第三题

给定一个字符串,对该字符串进行删除操作,保留 k 个字符且相对位置不变,使字典序最小。

题解

这题也脑抽了,想了一堆方法,dp 复杂度太高,线段树太麻烦,最后用 map 勉强写了一下。

主要思想是这样的,最后要保留 k 个字符,那么第一个字符只能在下标 0 ~ n-k 中寻找,那肯定找最小的啊,如果有多个就找最前面那个,把它的位置记为 pos

然后第二个字符肯定得在下标 pos ~ n-k+1 中寻找,还是一样的思路,找到以后更新 pos 位置,依次找下去找到 k 个为止。

所以我就利用了 map 的特性,把寻找窗口内的字符个数做一下统计,然后取出 map 中的第一个字符就是字典序最小的了,次数减一,如果减到 0 了就删除掉。

然后从 pos 位置开始遍历,直到第一个等于你刚刚取出的字符为止,更新 pos 位置。

最终的时间复杂度是  ,可以直接看作  。

最优解:

最优解当时没想出来,是用单调栈。维护一个递增的单调栈,我们的目标是保留 k 个字符,也就是删除 n-k 个字符。

那么如果栈顶元素大于当前遍历元素,并且还没删够 n-k 个,就出栈,当作删除了一个元素。否则的话如果删够了,不管大小关系统统入栈,因为你没法删了。

最后全遍历完了,如果还没删够,那就继续出栈,直到删够为止。最后把栈里的字符拼接成一个字符串就是答案了。

时间复杂度是  的。

代码

#include <bits/stdc++.h>
using namespace std;
string f(string s, int k) {
    int n = s.size();
    map<char, int> mp;
    for (int i = 0; i <= n-k; ++i) {
        mp[s[i]]++;
    }
    string res = "";
    int pos = 0;
    for (int i = k; i >= 1; --i) {
        char c = mp.begin()->first;
        res += c;
        for (int j = pos; j <= n-i; ++j) {
            mp[s[j]]--;
            if (!mp[s[j]]) mp.erase(s[j]);
            if (s[j] == c) {
                pos = j + 1;
                break;
            }
        }
        if (i == 1) break;
        mp[s[n-i+1]]++;
    }
    return res;
}
int main() {
    string s;
    int k;
    cin >> s >> k;
    cout << f(s, k) << endl;
}

最优解:

#include <bits/stdc++.h>
using namespace std;
string f(string s, int k) {
    int n = s.size();
    k = n - k;
    stack<char> st;
    for (int i = 0; i < n; ++i) {
        while (!st.empty() && st.top() > s[i] && k) {
            st.pop();
            k--;
        }
        st.push(s[i]);
    }
    string res = "";
    while (!st.empty()) {
        if (k) k--;
        else res += st.top();
        st.pop();
    }
    reverse(res.begin(), res.end());
    return res;
}
int main() {
    string s;
    int k;
    cin >> s >> k;
    cout << f(s, k) << endl;
}
相关文章
|
5天前
|
机器学习/深度学习 人工智能 算法
Enhance-A-Video:上海 AI Lab 推出视频生成质量增强算法,显著提升 AI 视频生成的真实度和细节表现
Enhance-A-Video 是由上海人工智能实验室、新加坡国立大学和德克萨斯大学奥斯汀分校联合推出的视频生成质量增强算法,能够显著提升视频的对比度、清晰度和细节真实性。
27 8
Enhance-A-Video:上海 AI Lab 推出视频生成质量增强算法,显著提升 AI 视频生成的真实度和细节表现
|
23天前
|
数据采集 人工智能 编解码
书生·万象InternVL 2.5:上海 AI Lab 开源的多模态大语言模型,超越了目前许多商业模型
书生·万象InternVL 2.5是由上海AI实验室OpenGVLab团队推出的开源多模态大语言模型系列。该模型在多模态理解基准(MMMU)上表现优异,超越了许多商业模型,适用于图像和视频分析、视觉问答、文档理解和多语言处理等多个领域。
75 7
书生·万象InternVL 2.5:上海 AI Lab 开源的多模态大语言模型,超越了目前许多商业模型
|
1月前
|
人工智能 vr&ar
GeneMAN:上海AI Lab联合北大等高校推出的3D人体模型创建框架
GeneMAN是由上海AI实验室、北京大学、南洋理工大学和上海交通大学联合推出的3D人体模型创建框架。该框架能够从单张图片中生成高保真度的3D人体模型,适用于多种应用场景,如虚拟试衣、游戏和娱乐、增强现实和虚拟现实等。
59 7
GeneMAN:上海AI Lab联合北大等高校推出的3D人体模型创建框架
|
2月前
|
人工智能 编解码 BI
LEOPARD:腾讯AI Lab西雅图实验室推出的视觉语言模型
LEOPARD是由腾讯AI Lab西雅图实验室推出的视觉语言模型,专为处理含有大量文本的多图像任务设计。该模型通过自适应高分辨率多图像编码模块和大规模多模态指令调优数据集,在多个基准测试中表现卓越,适用于自动化文档理解、教育和学术研究、商业智能和数据分析等多个应用场景。
42 2
LEOPARD:腾讯AI Lab西雅图实验室推出的视觉语言模型
|
2月前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
65 2
|
3月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
44 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
3月前
|
算法 Python
Python算法编程:冒泡排序、选择排序、快速排序
Python算法编程:冒泡排序、选择排序、快速排序
38 0
|
5月前
|
存储 算法 搜索推荐
编程之旅中的算法启示
【8月更文挑战第31天】在编程世界的迷宫里,算法是那把钥匙,它不仅能解锁问题的答案,还能引领我们深入理解计算机科学的灵魂。本文将通过一次个人的技术感悟旅程,探索算法的奥秘,分享如何通过实践和思考来提升编程技能,以及这一过程如何启示我们更深层次地认识技术与生活的交织。
|
6月前
|
存储 算法 搜索推荐
告别低效编程!Python算法设计与分析中,时间复杂度与空间复杂度的智慧抉择!
【7月更文挑战第22天】在编程中,时间复杂度和空间复杂度是评估算法效率的关键。时间复杂度衡量执行时间随数据量增加的趋势,空间复杂度关注算法所需的内存。在实际应用中,开发者需权衡两者,根据场景选择合适算法,如快速排序(平均O(n log n),最坏O(n^2),空间复杂度O(log n)至O(n))适合大规模数据,而归并排序(稳定O(n log n),空间复杂度O(n))在内存受限或稳定性要求高时更有利。通过优化,如改进基准选择或减少复制,可平衡这两者。理解并智慧地选择算法是提升代码效率的关键。
75 1
|
5月前
|
存储 算法
【C算法】编程初学者入门训练140道(1~20)
【C算法】编程初学者入门训练140道(1~20)

热门文章

最新文章