拼多多笔试 拼多多笔试题 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等多种语言做法集合指南
曼迪匹艾公司福利 121人发布