饿了么笔试 饿了么笔试题 0815

笔试时间:2025年8月15日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

给你一个整数 n,让你构造一个长度为 n 的数组 a,使得 a₁⊕a₂…aₙ == a₁|a₂…aₙ。

输入格式,第一行一个整数 T 代表样例个数,一次 T 行,一行一个整数 n

样例输入

2

4

2

样例输出

4 6 3 3

2 4

参考题解

C++:

#include <iostream>

int main() {
    int T;
    std::cin >> T;
    while (T--) {
        int n;
        std::cin >> n;
        if (n == 1) {
            std::cout << "114514\n";
        } elseif (n == 2) {
            std::cout << "1 2" << "\n";
        } else {
            if (n % 2 == 0) {
                std::cout << "1 2" << "\n";
                for (int i = 2; i < n; ++i) {
                    std::cout << 3 << " \n"[i == n - 1];
                }
            } else {
                for (int i = 0; i < n; ++i) {
                    std::cout << 114514 << "\n";
                }
            }
        }
    }
}

Java:

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        FastScanner fs = new FastScanner(System.in);
        StringBuilder out = new StringBuilder();
        int T = fs.nextInt();
        while (T-- > 0) {
            int n = fs.nextInt();
            if (n == 1) {
                out.append("114514\n");
            } else if (n == 2) {
                out.append("1 2\n");
            } else {
                if (n % 2 == 0) {
                    out.append("1 2\n");
                    for (int i = 0; i < n - 2; i++) {
                        if (i > 0) out.append(' ');
                        out.append('3');
                    }
                    out.append('\n');
                } else {
                    for (int i = 0; i < n; i++) {
                        out.append("114514\n");
                    }
                }
            }
        }
        System.out.print(out.toString());
    }

    // 简单快读
    static class FastScanner {
        BufferedReader br;
        StringTokenizer st;
        FastScanner(InputStream is) { br = new BufferedReader(new InputStreamReader(is)); }
        String next() throws IOException {
            while (st == null || !st.hasMoreTokens()) {
                String line = br.readLine();
                if (line == null) return null;
                st = new StringTokenizer(line);
            }
            return st.nextToken();
        }
        int nextInt() throws IOException { return Integer.parseInt(next()); }
    }
}

Python:

import sys

def main():
    data = sys.stdin.read().strip().split()
    it = iter(data)
    T = int(next(it))
    out_lines = []
    for _ in range(T):
        n = int(next(it))
        if n == 1:
            out_lines.append("114514")
        elif n == 2:
            out_lines.append("1 2")
        else:
            if n % 2 == 0:
                out_lines.append("1 2")
                out_lines.append(" ".join(["3"] * (n - 2)))
            else:
                out_lines.extend(["114514"] * n)
    sys.stdout.write("\n".join(out_lines))

if __name__ == "__main__":
    main()

第二题

给你一个长度为 n 的数组 ,代表了a根木棍。要求输出n-2个答案,第 i 个答案是由组成的正i多边形的方案数(对 998244353 取模)

样例输入

8

1 2 1 1 3 2 2 2

样例输出

5 1 0 0 0

参考题解

直接使用一个哈希表计数,统计每个长度的个数,随后枚举长度和边数,统计答案即可

C++:

#include <bits/stdc++.h>
usingnamespacestd;

constint MOD = 998244353;
using i64 = longlong;

i64 qpow(i64 a, i64 b) {
    i64 res = 1;
    while (b) {
        if (b & 1) res = res * a % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return res;
}

void solve() {
    int n;
    cin >> n;
    vector<i64> a(n), fact(n+1), invfact(n+1);
    map<i64,int> cnt;

    for (int i = 0; i < n; i++) {
        cin >> a[i];
        cnt[a[i]]++;
    }

    // 组合数预处理
    fact[0] = 1;
    for (int i = 1; i <= n; i++) fact[i] = fact[i-1] * i % MOD;
    invfact[n] = qpow(fact[n], MOD-2);
    for (int i = n-1; i >= 0; i--) invfact[i] = invfact[i+1] * (i+1) % MOD;

    auto C = [&](int N, int K) -> i64 {
        if (K < 0 || K > N) return0;
        return fact[N] * invfact[K] % MOD * invfact[N-K] % MOD;
    };

    vector<int> ans;
    for (int len = 3; len <= n; ++len) {
        i64 tot = 0;
        for (auto [_, v] : cnt) {
            if (v >= len) {
                tot = (tot + C(v, len)) % MOD;
            }
        }
        ans.push_back(tot);
    }

    for (int i = 0; i < (int)ans.size(); i++) {
        cout << ans[i] << (i+1 == ans.size() ? '\n' : ' ');
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    solve();
    return0;
}

Java:

import java.io.*;
import java.util.*;

public class Main {
    static final long MOD = 998244353L;

    static long modPow(long a, long b) {
        long res = 1 % MOD;
        a %= MOD;
        while (b > 0) {
            if ((b & 1) == 1) res = (res * a) % MOD;
            a = (a * a) % MOD;
            b >>= 1;
        }
        return res;
    }

    public static void main(String[] args) throws Exception {
        FastScanner fs = new FastScanner(System.in);
        int n = fs.nextInt();
        long[] a = new long[n];
        for (int i = 0; i < n; i++) a[i] = fs.nextLong();

        // 频次统计
        HashMap<Long, Integer> cnt = new HashMap<>();
        for (long x : a) cnt.put(x, cnt.getOrDefault(x, 0) + 1);

        // 阶乘与逆元
        long[] fact = new long[n + 1];
        long[] invfact = new long[n + 1];
        fact[0] = 1;
        for (int i = 1; i <= n; i++) fact[i] = (fact[i - 1] * i) % MOD;
        invfact[n] = modPow(fact[n], MOD - 2);
        for 

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

2025 春招笔试合集 文章被收录于专栏

2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南

全部评论

相关推荐

08-22 20:29
已编辑
东北大学 Java
进面试间,就是一句命令“把你摄像头打开”,自我介绍,说一半就被打断了,让我别墨迹,直接讲过往经历15min实习我实习是个小厂,然后他就全程蔑视我,让我讲技术难点,听完了说:“这就是你认为的难点?”“我已经重复这个问题好几次了”“就这个?”“呵呵行吧”20min八股+场景实现一个线程都有哪几种方式?Runnable&nbsp;和&nbsp;Callable的区别,内部的实现原理上有什么不一样?A、&nbsp;B、&nbsp;C&nbsp;三个线程同时启动,三个线程之间的执行顺序是先执行&nbsp;A,再执行&nbsp;B,再执行&nbsp;C,怎么达到这个结果?countdownlatch和cyclicbarrier的区别,内部实现区别Redis里面有1&nbsp;亿个key,里面有&nbsp;10&nbsp;万个&nbsp;key&nbsp;是以某个固定前缀开头的,如何能把它们找出来?数据库里面有&nbsp;2000&nbsp;万的数据,但是Redis&nbsp;中只能存&nbsp;20&nbsp;万的数据,怎么保证&nbsp;Redis&nbsp;中的数据都是热点数据?String&nbsp;s&nbsp;=&nbsp;new&nbsp;String(&quot;abc&quot;),创建了几个对象,都在哪静态代码块+继承+构造方法的输出顺序20min手撕1.&nbsp;sql,查询前一个月下单量最多的三天是哪三天2.&nbsp;保证线程输出顺序算上暑期,大大小小面了几十场面试,这是唯一一次让我真的感到被蔑视、不被尊重的一次,全程被压力闷了,基本没有问题是让我完整答完的,答一半就打断我,我回答完就说“行吧行吧”,我思考的时候,跟我说“不会就说不会,别瞎说,别浪费时间”。手撕写出来了,没有任何反馈,不让我讲思路,问我“你觉得你写的对吗”“你觉得对那就下一道”“行吧行吧”“我知道,我看到了”TMD&nbsp;恶心死我了&nbsp;面试过程我挤都挤不出来笑容更新,二面过了
推拿大师:建议过了如果有其他选择就别去,二面面试官很可能是直属leader,小心
投递字节跳动等公司10个岗位
点赞 评论 收藏
分享
头像
08-21 09:18
湖南大学 安卓
一个什么都不会的学生:骨头硬一点,你不欠她什么,能合作就合作,不能合作那还惯着谁啊,直接把你能骂的脏字全骂了就行了,打到家门口了不用忍了,打得一拳开,免得百拳来
你被mentor骂过吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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