饿了么笔试 饿了么笔试题 0815
笔试时间:2025年8月15日
往年笔试合集:
第一题
给你一个整数 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等多种语言做法集合指南