拼多多笔试 拼多多秋招 拼多多笔试题 0928
笔试时间:2025年9月28日
往年笔试合集:
第一题
多多在快递公司负责快递单号录入工作,这些单号有严格的格式要求:
- 快递单号由 3 部分组成:2 位大写字母(A-Z) + 6 位数字 + 1 位校验位
- 校验位计算规则:取前 8 位(2 字母 + 6 数字)中每个字符的 ASCII 码之和,对 26 取余后,加上 A 的 ASCII 码,得到的字符即为校验位
现在有一批可能存在校验位错误的单号,请你编写程序:
- 若单号格式正确且校验位正确,返回原单号
- 若前 8 位格式正确但校验位错误,返回修复后(校正校验位)的单号
- 若前 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
参考题解
解题思路:
- 首先检查单号长度是否为9
- 检查前2位是否为大写字母,第3-8位是否为数字
- 计算前8位字符的ASCII码之和
- 根据规则计算正确的校验位
- 返回修复后的单号
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打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南