顺丰笔试 顺丰秋招 顺丰笔试题 1012
笔试时间:2025年10月12日
往年笔试合集:
第一题:魔神的钞票
小明手头有一个面额为n的钞票,他试图钱生钱,魔神用语言欺骗小明将钞票给了魔神。魔神承诺拿到钞票后,会将钞票拆分成面额分别为⌊n/2⌋,n mod 2,⌊n/2⌋的钞票(显然钞票的总金额没有发生变化,而且会出现面值为0的钞票),然后退回给小明。小明已经失去了理智,他会将所有面额大于1的钞票与魔神兑换,请问他最后会有几张面额为0的钞票。
n mod 2指n除以2的余数,例如3 mod 2 = 1,4 mod 2 = 0。⌊x⌋指最大且不大于x的整数。
输入描述
数据包括多组样例。首先输入T,表示一共有T组样例。样例最多100组。每组输入包括一个整数n,保证(1 ≤ n ≤ 10^18)
输出描述
对于每组数据,输出一行,包括一个正整数,表示一共有多少0出现。
样例输入
1
100
样例输出
27
样例说明: 100会分为2个50和1个0,然后分为4个25和2个0,然后分为8个12和4个1,然后分为16个6和8个0,然后分为32个3和16个0,接着分为64个1和32个1,至此共产生了27个0。
参考题解
解题思路: 这道题目中,小明会把所有面额大于1的钞票继续与魔神兑换(即拆分),直到所有钞票面额≤1。我们要统计最后有多少张面额为0的钞票。这其实是一个递归过程,虽然n很大有n=10^18,但是拆分是二叉树形式,深度只有O(log n),所以直接递归即可。
C++:
#include <iostream> using namespace std; long long countZero(long long x) { if (x == 0) return 1; if (x == 1) return 0; if (x % 2 == 0) { return 2 * countZero(x / 2) + 1; // 偶数,拆成2张x/2和1张0元的 } else { return 2 * countZero(x / 2); // 奇数,拆成2张x/2和1张1元的(1元不会对计数0有帮助) } } int main() { int T; cin >> T; while (T-- > 0) { long long n; cin >> n; cout << countZero(n) << endl; } return 0; }
Java:
import java.util.*; class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int T = in.nextInt(); while (T-- > 0) { long n = in.nextLong(); System.out.println(countZero(n)); } } // 计算有多少个0 private static long countZero(long x) { if (x == 0) return 1; if (x == 1) return 0; if (x % 2 == 0) { return 2 * countZero(x / 2) + 1; // 偶数,拆成2张x/2和1张0元的 } else { return 2 * countZero(x / 2); // 奇数,拆成2张x/2和1张1元的(1元不会对计数0有帮助) } } }
Python:
def count_zero(x): if x == 0: return 1 if x == 1: return 0 if x % 2 == 0: return 2 * count_zero(x // 2) + 1 # 偶数,拆成2张x/2和1张0元的 else: return 2 * count_zero(x // 2) # 奇数,拆成2张x/2和1张1元的 T = int(input()) for _ in range(T): n = int(input()) print(count_zero(n))
第二题:停车场
小明的公司停车场最近引入了一个车辆记录系统。当有一个编号为i的车驶入时,系统会报告(+i)。当编号为j的车驶出时,系统会报告(-j)。这个系统在某个时刻启动了,并一直记录了连续的一段时间的车辆情况。很遗憾的是,该系统有漏洞,可能会重复或缺失车辆进入的信息,但是车辆驶出的信息绝不会出现错误。现在小明想要通过这份系统的报告来推测,这个停车场的最小容量是多少辆车。注意当停车场满的时候没有车能够驶入。
输入描述
第一行1个整数T,表示数据组数。
对每组数据:
第一行两个整数n和m
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南