拼多多笔试 拼多多笔试题 0803
笔试时间:2025年8月3日
往年笔试合集:
第一题
如果一个年份的每位数字(不包含前导零)都不相同,则定义这个年份为幸运的。 多多会给出一些年份,对于每个年份,你需要找出大于这个年份的最小幸运年份。
输入描述
第一行,包含一个正整数T(1 ≤ T ≤ 10)代表测试数据的组数。
对于每组测试数据,仅有一行正整数n(0 ≤ n ≤ 10⁶),表示多多给出的年份。
输出描述
对于每组数据,输出一行正整数,表示大于给出年份的最小幸运年份。输出不包含前导零。
样例输入
2
1881
2211
样例输出
1890
2301
解释: 所有可能的分法(忽略元素顺序)为: 1.(1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3 2.(1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3 3.(1, 2), (3, 4) -> min (1, 2) + min (3, 4) = 1 + 3 = 4 所以最大总和为 4
参考题解
对于每个给定年份 n,只要把 n 递增 1、2、3…,并用一个 10 位掩码检测其各位数字是否出现重复:在循环中不断取最低位 d(n % 10),若对应位已被置 1 则说明有重复;否则把该位设 1 并继续,直到数字取完;第一个通过检测的年份就是答案——检测一次只扫 4‒5 位数字,整体复杂度随测试用例数线性,空间 O(1)。
C++:
#include <bits/stdc++.h> using namespace std; // 判断数字是否“幸运”——各位数字互不相同 bool ok(int n) { int m = 0; // 出现过的数字位掩码 while (n) { int d = n % 10; // 当前个位 n /= 10; if (m & (1 << d)) return false; // 重复 m |= 1 << d; // 标记 } return true; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; // 测试用例数 cin >> t; while (t--) { int y; // 给定年份 cin >> y; for (int x = y + 1;; ++x) { // 枚举下一个年份 if (ok(x)) { cout << x << '\n'; break; } } } return 0; }
Java:
import java.util.Scanner; public class LuckyYear { // 判断数字是否“幸运”——各位数字互不相同 public static boolean ok(int n) { int m = 0; // 出现过的数字位掩码 while (n > 0) { int d = n % 10; // 当前个位 n /= 10; if ((m & (1 << d)) != 0) { return false; // 数字重复 } m |= 1 << d; // 标记该数字已出现 } return true; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int t = scanner.nextInt(); // 测试用例数 while (t-- > 0) { int y = scanner.nextInt(); // 给定年份 // 枚举下一个年份 for (int x = y + 1; ; x++) { if (ok(x)) { System.out.println(x); break; } } } scanner.close(); } }
Python:
# 判断数字是否“幸运”——各位数字互不相同 def is_ok(n): m = 0 # 出现过的数字位掩码 while n > 0: d = n % 10 # 当前个位 n = n // 10 if m & (1 << d): return False # 数字重复 m |= 1 << d # 标记该数字已出现 return True t = int(input()) # 测试用例数 for _ in range(t): y = int(input()) # 给定年份 # 枚举下一个年份 x = y + 1 while True: if is_ok(x): print(x) break x += 1
第二题
在二维地图上,有n个能源站,坐标依次为(x₁,y₁),(x₂,y₂),…,(xₙ,yₙ) 一开始所有的能源站都是关闭状态。若能源站i变为开启状态,则能源站i能够把距离(直线距离)它不超过r_i的所有能源站也变为开启状态, 然后新启动的能源站也有可能继续把其它能源站变为开启状态。 多多现在能够开启任意一个能源站,请你计算最多能使多少个能源站变为开启状态。
输入描述
第一行一个整数T(1 ≤ T ≤ 10),接下来有T组数据 每组数据第一行一个整数n(1 ≤ n ≤ 100)
接下来n行,每行3个整数x_i,y_i,r_i(0 ≤ x_i,y_i ≤ 10⁹)(1 ≤ r_i ≤ 10⁹)
输出描述
对于每组数据,输出一行,每行一个数,表示最多能使多少个能源站变为开启状态
样例输入
3
2
0 0 1
2 0 1
3
0 0 1
1 0 1
3 0 1
4
0 0 4
2 0 1
3 0 1
5 0 1
样例输出
1
2
3
说明: 第一组:多多开启"1";总共开启1个 第二组:多多开启"1","1"开启"2";总共开启2个 第三组数据:多多开启"1","1"开启"2"、"3";总共开启3个。
参考题解
C++:
#include <bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T; if (!(cin >> T)) return 0; while (T--) { int n; cin >> n; vector<long long> x(n), y(n), r(n); for (int i = 0; i < n; ++i) cin >> x[i] >> y[i] >> r[i]; // 1. 建图:i -> j 当且仅当 j 落在 i 的作用半径内 vector<vector<int>> g(n); for (int i = 0; i < n; ++i) { long long lim = r[i] * r[i]; for (int j = 0; j < n; ++j) { long long dx = x[j] - x[i]; long long dy = y[j] - y[i]; if (dx * dx + dy * dy <= lim) g[i].push_back(j); } } // 2. 枚举起点,DFS 统计可达节点数并取最大 int best = 0; vector<int> stk; vector<char> vis(n); for (int s = 0; s < n && best < n; ++s) { // 剪枝:已达上限可提前结束 fill(vis.begin(), vis.end(), 0); stk.clear(); stk.push_back(s); vis[s] = 1; while (!stk.empty()) { int u = stk.back(); stk.pop_back(); for (int v : g[u]) if (!vis[v]) { vis[v] = 1; stk.push_back(v); } } best = max(best, (int)count(vis.begin(), vis.end(), 1)); } cout << best << '\n'; } return 0; }
Java:
import java.util.*; import java.io.*; public class MaxConnection { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); while (T-- > 0) { int n = Integer.parseInt(br.readLine()); long[] x = new long[n]; long[] y = new long[n]; long[] r = new long[n]; for (int i = 0; i < n; i++) { StringTokenizer st = new StringTokenizer(br.readLine()); x[i] = Long.parseLong(st.nextToken()); y[i] = Long.parseLong(st.nextToken()); r[i] = Long.parseLong(st.nextToken()); } // 建图:i -> j 当且仅当 j 落在 i 的作用半径内 List<List<Integer>> graph = new ArrayList<>(); for (int i = 0; i < n; i++) { graph.add(new ArrayList<>()); long lim = r[i] * r[i]; for (int j = 0; j < n; j++) { long dx = x[j] - x[i]; long dy = y[j] - y[i]; if (dx * dx + dy * dy <= lim) { graph.get(i).add(j); } } } // 枚举起点,DFS统计可达节点数并取最大 int best = 0; boolean[] visited = ne
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南