顺丰笔试 顺丰秋招 顺丰笔试题 1012

笔试时间:2025年10月12日

往年笔试合集:

2023春招秋招笔试合集

2024春招秋招笔试合集

第一题:魔神的钞票

小明手头有一个面额为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 春招笔试合集 文章被收录于专栏

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

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

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