拼多多笔试 拼多多笔试题 0803

笔试时间:2025年8月3日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

如果一个年份的每位数字(不包含前导零)都不相同,则定义这个年份为幸运的。 多多会给出一些年份,对于每个年份,你需要找出大于这个年份的最小幸运年份。

输入描述

第一行,包含一个正整数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 春招笔试合集 文章被收录于专栏

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

全部评论

相关推荐

牛客28501546...:后面三个勾勾是自己手绘的吗
腾讯开奖371人在聊
点赞 评论 收藏
分享
评论
1
6
分享

创作者周榜

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