顺丰笔试 顺丰秋招 顺丰笔试题 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等多种语言做法集合指南

全部评论

相关推荐

10-15 15:10
上海大学 Java
顺丰在今年秋招采用的线上+线下结合的方式,一面是线上,二面和hr面是线下,一面体验不错,面试官人还行,会有交互,反问阶段也在认真回答我提出的问题。但是二面和hr面体验很差,线下的招聘同学态度也不好。我本着来都来了的心态面完的,本就没指望能泡出来,反正泡出来了也不会去。9月9日,线上一面,30分钟左右:1.自我介绍2.缓存体系为什么要用三级缓存,如何同步的3.如果要求强一致,怎么办4.MongoDB数据迁移怎么做的,冷更新还是热更新5.热更新的话,如果在迁移过程中有新的写请求过来怎么办6.如果迁移过程中有数据库中有更新,两方数据不一致怎么办7.xxl-job架构讲一下,如何防止一段逻辑被多个执行器调用8.集群部署时,如果要多节点调用怎么办9.OkHttp讲一下,线程池怎么用的10.如何区分长连接和短连接,有没有用过抓包11.数据库行锁表锁解释一下,什么情况下行锁会升级成表锁12.MySQL垂直分库和水平分库讲一下13.http和https的区别14.小程序中功能隔离怎么做的15.反问一面综合体验不错,面完有不少收获。但是大的来了,9月26号,线下二面,轮到我的时候,面试官一直在处理工作上的事,在那一直敲电脑,我坐在他对面,他看都不看我一眼,他先是让我等了十分钟左右,我在那干看着他敲电脑,十分钟后开始面试,他就随便问了几条问题,我在回答的时候他也没有听,就在那处理事情,无语,二面时长大概20min(算上了等待的时间):1.自我介绍2.大模型怎么应用的3.两级缓存为什么这么设计,如果要求强一致性怎么办4.Redis中常见的数据结构5.RocketMQ和RabbitMQ区别6.MySQL、es、mongo的区别7.volatile作用8.反问面完之后我就去问了问外面坐的招聘组后续流程,他给我发了一份背调协议,让我签了,我还在奇怪流程还没走完咋就要签背调,然后就叫我去等着面hr面,在外面坐了大概一小时,到我hr面,全程15分钟左右:1.自我介绍2.为什么选择顺丰的java后端3.不擅长的事4.base地选择,base不限的话,如果非要有个排序呢5.兴趣和爱好6.平时怎么学习的7.是不是独生,家里人的意见8.实习中遇到的困难,如何克服的9.反问【总结】线下体验极差,两轮面试的时间加起来还不如我等待时间的一半并且这两轮面下来也完全没有收获,属于是白跑一趟了
发面经攒人品
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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