拼多多笔试 拼多多秋招 拼多多笔试题 0928

笔试时间:2025年9月28日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题

多多在快递公司负责快递单号录入工作,这些单号有严格的格式要求:

  1. 快递单号由 3 部分组成:2 位大写字母(A-Z) + 6 位数字 + 1 位校验位
  2. 校验位计算规则:取前 8 位(2 字母 + 6 数字)中每个字符的 ASCII 码之和,对 26 取余后,加上 A 的 ASCII 码,得到的字符即为校验位

现在有一批可能存在校验位错误的单号,请你编写程序:

  1. 若单号格式正确且校验位正确,返回原单号
  2. 若前 8 位格式正确但校验位错误,返回修复后(校正校验位)的单号
  3. 若前 8 位格式错误(非 2 字母 + 6 数字)或快递单号不满足格式要求,返回字符串 Invalid

输入描述

共一行,一个字符串(1≤长度≤1024),表示待校验的快递单号。

输出描述

共一行,一个字符串,表示修复后的快递单号,若无法修复则返回字符串Invalid

样例输入

AB123456C

样例输出

AB123456Y

样例说明

前 8 位字符:A(ASCII 码 = 65)、B(ASCII 码 = 66)、1(ASCII 码 = 49)、2(ASCII 码 = 50)、3(ASCII 码 = 51)、4(ASCII 码 = 52)、5(ASCII 码 = 53)、6(ASCII 码 = 54)总和:65+66+49+50+51+52+53+54=440,440%26=24,24+65(A 的 ASCII 码)=89,对应字符 Y因此该单号校验位错误,正确单号应为 AB123456Y

参考题解

解题思路:

  1. 首先检查单号长度是否为9
  2. 检查前2位是否为大写字母,第3-8位是否为数字
  3. 计算前8位字符的ASCII码之和
  4. 根据规则计算正确的校验位
  5. 返回修复后的单号

C++:

#include <iostream>
#include <string>
using namespace std;

void solve(string s) {
    // 检查长度
    if (s.length() != 9) {
        cout << "Invalid" << endl;
        return;
    }
    
    // 检查前两位是否为大写字母
    if (!isupper(s[0]) || !isupper(s[1])) {
        cout << "Invalid" << endl;
        return;
    }
    
    // 检查第3-8位是否为数字
    for (int i = 2; i <= 7; i++) {
        if (!isdigit(s[i])) {
            cout << "Invalid" << endl;
            return;
        }
    }
    
    // 检查第9位是否为字母
    if (!isalpha(s[8])) {
        cout << "Invalid" << endl;
        return;
    }
    
    // 计算正确的校验位
    int sum = 0;
    for (int i = 0; i < 8; i++) {
        sum += s[i];
    }
    
    int correctCheckDigitAscii = (sum % 26) + 'A';
    char correctCheckDigit = (char)correctCheckDigitAscii;
    
    // 输出修复后的单号
    string result = s.substr(0, 8) + correctCheckDigit;
    cout << result << endl;
}

int main() {
    string trackingNumber;
    while (getline(cin, trackingNumber)) {
        if (!trackingNumber.empty()) {
            solve(trackingNumber);
        }
    }
    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextLine()) {
            String trackingNumber = scanner.nextLine();
            if (trackingNumber == null || trackingNumber.isEmpty()) {
                continue;
            }
            solve(trackingNumber);
        }
        scanner.close();
    }
    
    public static void solve(String s) {
        // 1. 格式校验:检查总长度是否为9
        if (s.length() != 9) {
            System.out.println("Invalid");
            return;
        }
        
        // 2. 格式校验:检查前8位的格式(2个大写字母 + 6个数字)
        if (!Character.isUpperCase(s.charAt(0)) || !Character.isUpperCase(s.charAt(1))) {
            System.out.println("Invalid");
            return;
        }
        
        for (int i = 2; i <= 7; i++) {
            if (!Character.isDigit(s.charAt(i))) {
                System.out.println("Invalid");
                return;
            }
        }
        
        if (!Character.isLetter(s.charAt(8))) {
            System.out.println("Invalid");
            return;
        }
        
        // 3. 计算正确的校验位
        int sum = 0;
        for (int i = 0; i < 8; i++) {
            sum += s.charAt(i);
        }
        
        int correctCheckDigitAscii = (sum % 26) + 'A';
        char correctCheckDigit = (char) correctCheckDigitAscii;
        
        // 4. 构造并输出结果
        String prefix = s.substring(0, 8);
        String correctedNumber = prefix + correctCheckDigit;
        System.out.println(correctedNumber);
    }
}

Python:

def solve(s):
    # 检查长度
    if len(s) != 9:
        print("Invalid")
        return
    
    # 检查前两位是否为大写字母
    if not s[0].isupper() or not s[1].isupper():
        print("Invalid")
        return
    
    # 检查第3-8位是否为数字
    for i in range(2, 8):
        if not s[i].isdigit():
            print("Invalid")
            return
    
    # 检查第9位是否为字母
    if not s[8].isalpha():
        print("Invalid")
        return
    
    # 计算正确的校验位
    total_sum = 0
    for i in range(8):
        total_sum += ord(s[i])
    
    correct_check_digit_ascii = (total_sum % 26) + ord('A')
    correct_check_digit = chr(correct_check_digit_ascii)
    
    # 输出修复后的单号
    result = s[:8] + correct_check_digit
    print(result)

while True:
    try:
        tracking_number = input().strip()
        if tracking_number:
            solve(tracking_number)
    except EOFError:
        break

第二题

圣诞节快到了,有一棵挂满彩灯的二叉树,需要你按照图纸装饰。彩灯有 5 种颜色变化,分别用 1-5 表示。1 表示红色,2 表示黄色,3 表示蓝色,4 表示紫色,5 表示绿色。每个节点都有一个颜色控制器,每按一下,就会将当前彩灯以及以当前节点为根节点的子树上的所有节点,切换到下一个颜色(红 -> 黄 -> 蓝 -> 紫 -> 绿 -> 红...)循环切换。

给定二叉树的初始状态 initial 和目标状态 target,两者都以层序遍历产出的一维数组表示。数组元素对应对应位置节点的颜色,0 表示该节点没有彩灯。

请给出从 initial 状态切换至 target 状态需要的最少控制器点击次数。

注意:控制器按一下,不只影响当前节点,也会影响以当前节点为根节点的子树上所有节点切换到下一个颜色(最终不一定是同一个颜色)。

输入描述

第一行输入为一个整数 n,代表 initial 和 target 数组的大小。 第二行输入为 n 个整数,代表 initial 数组。 第三行输入为 n 个整数,代表 target 数组。 其他:如果 initial[i] == 0,则 target[i] 也一定为 0。1≤initial.length≤10^6

输出描述

一个整数,表示最少点击次数。

样例输入

5

1 2 3 0 1

2 3 1 0 2

样例输出

3

参考题解

解题思路:

从根节点开始,按层序遍历的顺序处理每个节点。对于每个节点,计算它需要点击的次数,然后将影响传递给子节点。

C++:

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    
    vector<int> initial(n);
    for (int i = 0; i < n; i++) {
        cin >> initial[i];
    }
    
    vector<int> target(n);
    for (int i = 0; i < n; i++) {
        cin >> target[i];
    }
    
    vector<int> shift(n, 0);
    long totalClicks = 0;
    
    for (int i = 0; i < n; i++) {
        if (initial[i] == 0) {
            continue;
        }
        
        int initialVal = initial[i] - 1;
        int targetVal = target[i] - 1;
        
        int currentVal = (initialVal + shift[i]) % 5;
        int clicksAtNode = (targetVal - currentVal + 5) % 5;
        
        totalClicks += clicksAtNode;
        
        int shiftForChildren = (shift[i] + clicksAtNode) % 5;
        
        int leftChild = 2 * i + 1;
        if (leftChild < n) {
            shift[leftChild] = shiftForChildren;
        }
        
        int rightChild = 2 * i + 2;
        if (rightChild < n) {
            shift[rightChild] = shiftForChildren;
        }
    }
    
    cout << totalClicks << endl;
    return 0;
}

Java:

import java.util.Scanner;

public class Main {
    public static voi

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

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

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

全部评论

相关推荐

评论
点赞
1
分享

创作者周榜

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