【每日算法Day 101】字节跳动 AI Lab 精选面试编程题

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 【每日算法Day 101】字节跳动 AI Lab 精选面试编程题

今天字节三面结束了,超越妹妹保佑我通过吧!今天更新两道同学之前面试 AI Lab 时遇到的题。

0-1 背包问题(浮点数)

0-1 背包问题,一共 n < 20 个物品,每个物品价格 p[i] (浮点数),重量 w[i] (浮点数),背包容量 M (浮点数)。求最大能装的价值是多少?

输入:
20 678.91
23.56 51.56
31.45 23.56
62.54 45.62
15.32 42.23
12.32 65.32
65.12 32.45
15.65 45.78
62.15 98.32
32.15 45.62
15.44 95.32
45.65 99.45
32.15 22.48
23.56 51.56
31.45 23.56
62.54 45.62
15.32 42.23
12.32 65.32
65.12 32.45
15.65 45.78
62.15 98.32
输出:
1050.07

题解

因为这里全部都是浮点数,所以没有办法直接用普通的动态规划来做,这里我提供几个思路。

方法1:

如果小数点只有两位的话,很简单,所有数字统一乘以 100 ,那么就都变成整数了。然后就可以直接用普通的 0-1 背包方法来做。

方法2:

因为 n < 20 ,所以直接二进制枚举所有物品可能,然后取出重量小于背包容量,且价格最高的那一种就行了。时间复杂度  ,勉强可以接受。

方法3:

n 个物品平均分成两份,对每一份做二进制枚举,然后保存所有可能的总重量和对应的总价格。保存在两个数组中,记为 ab ,分别表示两份的所有可能情况。

预处理出 b 中重量小于等于 b[j].w 的最大价格,保存在 maxp[j] 中。

分别按照 w 排序,然后用双指针,从重量小的开始遍历 a 中每个元素 a[i] ,在 b 中找出重量最高的那个满足 a[i].w + b[j].w 不超过背包容量的 j

然后 i 移动到 i+1 ,也就是重量增加了,那么 j 只能减小了,直到减小到 a[i].w + b[j].w 再次不超过背包容量。然后直接取预处理好的 maxp[j]+a[i].p 和最优答案比较就行了。

最终时间复杂度是  ,相比上面直接二进制枚举所有情况,大大降低了呀。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int N = 22;
struct node {
    double w, p;
    bool operator < (const node& rhs) const {
        return w < rhs.w;
    }
} a[1<<N], b[1<<N];
int main() {
    int n;
    double M;
    scanf("%d%lf", &n, &M);
    printf("%f\n", M);
    vector<double> w(n, 0), p(n, 0);
    for (int i = 0; i < n; ++i) {
        scanf("%lf%lf", &w[i], &p[i]);
    }
    printf("%f\n", tmp);
    int ca = 0, cb = 0;
    for (int s = 0; s < (1<<(n/2)); ++s) {
        double tot_w = 0, tot_p = 0;
        for (int i = 0; i < n/2; ++i) {
            if (s&(1<<i)) {
                tot_w += w[i];
                tot_p += p[i];
                if (tot_w > M) break;
            }
        }
        if (tot_w <= M) {
            a[ca].w = tot_w;
            a[ca].p = tot_p;
            ca++;
        }
    }
    for (int s = 0; s < (1<<(n-n/2)); ++s) {
        double tot_w = 0, tot_p = 0;
        for (int i = 0; i < n-n/2; ++i) {
            if (s&(1<<i)) {
                tot_w += w[n/2+i];
                tot_p += p[n/2+i];
                if (tot_w > M) break;
            }
        }
        if (tot_w <= M) {
            b[cb].w = tot_w;
            b[cb].p = tot_p;
            cb++;
        }
    }
    sort(a, a+ca);
    sort(b, b+cb);
    vector<double> maxp(cb, 0);
    maxp[0] = b[0].p;
    for (int i = 1; i < cb; ++i) {
        maxp[i] = max(maxp[i-1], b[i].p);
    }
    int j = cb-1;
    double res = 0;
    for (int i = 0; i < ca; ++i) {
        while (j >= 0 && a[i].w+b[j].w > M) --j;
        if (j < 0) break;
        res = max(res, a[i].p+maxp[j]);
    }
    printf("%f\n", res);
    return 0;
}

最小长度子数组

给一个正数数组,找出最小长度连续子数组,其和大于等于 m

题解

这题还是用双指针,首先用 i 遍历每一个位置,然后维护 a[j] ~ a[i] 之间的元素和。如果发现和大于等于 m ,那就更新最小长度,同时增大 j 直到区间和小于 m 。最终时间复杂度是  的。

代码

#include <bits/stdc++.h>
using namespace std;
int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    vector<int> a(n, 0);
    for (int i = 0; i < n; ++i) {
        scanf("%d", &a[i]);
    }
    int j = 0, sum = 0, res = INT_MAX;
    for (int i = 0; i < n; ++i) {
        sum += a[i];
        while (sum >= m) {
            res = min(res, i-j+1);
            sum -= a[j++];
        }
    }
    printf("%d\n", res);
    return 0;
}
相关文章
|
10月前
|
人工智能 数据可视化 定位技术
不会编程也能体验的 AI 魔法,外滩大会代码原生地等你解锁
不会编程也能体验的 AI 魔法,外滩大会代码原生地等你解锁
600 39
|
10月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
295 3
|
10月前
|
人工智能 运维 监控
让天下没有难查的故障:2025 阿里云 AI 原生编程挑战赛正式启动
本次大赛由阿里云主办,云原生应用平台承办,聚焦 Operation Intelligence 的智能运维(AIOps)赛道,为热爱 AI 技术的开发者提供发挥创意和想象力的舞台,借助 LLM 强大的推理能力与标准化整合的多源可观测数据,找到 AI 应用在智能运维(AIOps)场景上的新方式。
975 31
|
11月前
|
人工智能 自然语言处理 搜索推荐
AI Compass前沿速览:Qoder Agentic编程、vivo Vision头显、AIRI桌面伴侣、RM-Gallery奖励模型平台
AI Compass前沿速览:Qoder Agentic编程、vivo Vision头显、AIRI桌面伴侣、RM-Gallery奖励模型平台
AI Compass前沿速览:Qoder Agentic编程、vivo Vision头显、AIRI桌面伴侣、RM-Gallery奖励模型平台
|
10月前
|
人工智能 算法 小程序
再见 Cursor,Qoder 真香!这波要改写 AI 编程格局
真心建议大家去使用一下这段时间最新推出的一款 AI 编程工具:Qoder 。真的是太好用了,一点也不比 Cursor 差。
1815 10
|
9月前
|
存储 人工智能 JSON
揭秘 Claude Code:AI 编程入门、原理和实现,以及免费替代 iFlow CLI
本文面向对 AI Coding 感兴趣的朋友介绍 Claude Code。通过此次分享,可以让没有体验过的快速体验,体验过的稍微理解其原理,以便后续更好地使用。
3590 18
揭秘 Claude Code:AI 编程入门、原理和实现,以及免费替代 iFlow CLI
|
10月前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
281 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
10月前
|
存储 消息中间件 人工智能
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
633 10
【08】AI辅助编程完整的安卓二次商业实战-修改消息聊天框背景色-触发聊天让程序异常终止bug牵涉更多聊天消息发送优化处理-优雅草卓伊凡
|
10月前
|
存储 消息中间件 人工智能
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
【04】AI辅助编程完整的安卓二次商业实战-寻找修改替换新UI首页图标-菜单图标-消息列表图标-优雅草伊凡
581 4