【每日算法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;
}
相关文章
|
7天前
|
人工智能 自然语言处理 程序员
无编程经验小白如何玩转通义灵码 AI 程序员,让写代码像聊天一样简单
没有编程经验的小白如何玩转通义灵码 AI 程序员,让写代码像聊天一样简单
153 22
|
27天前
|
算法 安全 Java
Java线程调度揭秘:从算法到策略,让你面试稳赢!
在社招面试中,关于线程调度和同步的相关问题常常让人感到棘手。今天,我们将深入解析Java中的线程调度算法、调度策略,探讨线程调度器、时间分片的工作原理,并带你了解常见的线程同步方法。让我们一起破解这些面试难题,提升你的Java并发编程技能!
66 16
|
2月前
|
人工智能 自然语言处理 测试技术
DeepSeek V3:DeepSeek 开源的最新多模态 AI 模型,编程能力超越Claude,生成速度提升至 60 TPS
DeepSeek V3 是深度求索公司开源的最新 AI 模型,采用混合专家架构,具备强大的编程和多语言处理能力,性能超越多个竞争对手。
839 5
DeepSeek V3:DeepSeek 开源的最新多模态 AI 模型,编程能力超越Claude,生成速度提升至 60 TPS
|
1月前
|
人工智能 Java API
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
本次分享的主题是阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手,由阿里云两位工程师分享。
阿里云工程师跟通义灵码结伴编程, 用Spring AI Alibaba来开发 AI 答疑助手
|
1月前
|
人工智能 自然语言处理 API
大模型编程(3)让 AI 帮我调接口
这是大模型编程系列第三篇,分享学习某云大模型工程师ACA认证免费课程的笔记。本文通过订机票和查天气的例子,介绍了如何利用大模型API实现函数调用,解决实际业务需求。课程内容详实,推荐感兴趣的朋友点击底部链接查看原文,完全免费。通过这种方式,AI可以主动调用接口并返回结果,极大简化了开发流程。欢迎在评论区交流实现思路。
183 1
|
2月前
|
人工智能 测试技术 开发者
AI 编码助手:编程路上的得力伙伴
在数字化浪潮中,AI编码助手成为开发者不可或缺的工具。它通过代码生成与补全、优化与规范、错误检测与调试等功能,大幅提升编程效率和代码质量。从需求分析到部署,AI助手全程助力,确保项目顺利进行。尽管不能替代开发者创造力,但它无疑是编程道路上的得力伙伴,推动软件开发不断创新。
127 12
|
3月前
|
人工智能 安全 JavaScript
Open Interpreter:AI 赋能终端!在终端中对话AI模型进行编程,通过运行代码来完成各种计算机操作任务
Open Interpreter 是一个让语言模型运行代码的强大工具,提供了一个类似 ChatGPT 的界面,支持多种编程语言和丰富的功能。
159 7
Open Interpreter:AI 赋能终端!在终端中对话AI模型进行编程,通过运行代码来完成各种计算机操作任务
|
2月前
|
人工智能
带上团队一起来做 AI 编程实践丨通义灵码联合TGO鲲鹏会开启 AI 大课
带上团队一起来做 AI 编程实践丨通义灵码联合TGO鲲鹏会开启 AI 大课
|
2月前
|
人工智能 并行计算 调度
【AI系统】CUDA 编程模式
本文介绍了英伟达GPU的CUDA编程模型及其SIMT执行模式,对比了SIMD和SIMT的特点,阐述了SIMT如何提高并行计算效率和编程灵活性。同时简要提及了AMD的GPU架构及编程模型,包括最新的MI300X和ROCm平台。
85 5
|
3月前
|
机器学习/深度学习 人工智能 并行计算
【AI系统】芯片的编程体系
本文探讨了SIMD与SIMT的区别及联系,分析了SIMT与CUDA编程的关系,深入讨论了GPU在SIMT编程的本质及其与DSA架构的关系。文章还概述了AI芯片的并行分类与并行处理硬件架构,强调了理解AI芯片编程体系的重要性,旨在帮助开发者更高效地利用AI芯片算力,促进生态繁荣。
67 0

热门文章

最新文章