【2022-08-31】顺丰秋招笔试两道编程题

恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经,目前已更新至美团、微软…
作者@TechGuide【全网同名】
点赞再看,养成习惯,您动动手指对原创作者意义非凡🤝

第一题:幸运数

题目描述

小昱非常喜欢5这个数字,如果一个数在十进制表示下数字5出现了不少于5次,则是一个幸运数。例如,55555、152****55565就是幸运数;而5、123则不是幸运数。小昱想知道大于N的最小的幸运数是多少。

思路

看到这题懒得多想,暴力硬解即可。很明显最坏的复杂度只有10万。比如输入 155555,我需要遍历到 255555 。因此, 必不可能超时。

代码

作者:觞乄默
链接:https://www.nowcoder.com/discuss/1035019?type=all&order=recall&pos=&page=2&ncTraceId=&channel=-1&source_id=search_all_nctrack
来源:牛客网

Python版本
n = int(input()) + 1
while str(n).count('5') < 5:
    n += 1
print(n)
# vx公众号关注TechGuide 实时题库 闪电速递

第二题:猜测序列

题目描述

小明有一个由1到n的整数组成的排列,他让你来猜出这个排列是什么。你每次可以猜测某一位置的数字,小明会告诉你所猜测的数是“大了”、“小了”或是“正确”。你想知道你在最坏情况下,需要猜测几次,才能在排列的所有位置都得到小明“正确”的回复?

思路

这题其实看懂题难度大于写代码难度,解法想明白之后很好写。

就拿样例输入 5, 输出 11 为例分析一下:

  1. 首先,我猜第一个位置的数。它有 5 种可能性,采用二分猜测的方法,最坏情况下要猜 3 次
  2. 然后,第二个位置的数只剩下 4种可能性,但最坏情况下依然要猜 3 次。
  3. 第三个位置,只剩下 3 种可能性了,因此在 2 次之内一定能猜出来。
  4. 同理,第四、第五个位置分别需要 2、1 次。总次数为 3+3+2+2+1 = 11

代码实现:使用循环,先把 1 到 2^p - 1 的f值求和,再加上 2^p 到 n 的f值即可 。复杂度为 O(log n)。

代码

CPP版本
#include<iostream>
#include<vector>

using namespace std;

vector<vector<long long>> children;
vector<long long> value;

void dfs(int u,long long &pos,long long &neg){
    for(int v:children[u]){
        long long tp=0,tn=0;
        dfs(v,tp,tn);
        pos = max(pos,tp);
        neg = max(neg,tn);
    }
    long long val = value[u]+pos-neg;
    if(val>0){
        neg+=val;
    }
    else{
        pos-=val;
    }
    pos=pos;
    neg=neg;
}

int main(){
    int n;
    cin>>n;
    children.resize(n+1);
    value.resize(n+1);
    for(int i=2;i<=n;++i){
        int p;
        cin>>p;
        children[p].push_back(i);
    }
    for(int i=1;i<=n;++i){
        cin>>value[i];
    }
    long long pos=0,neg=0;
    dfs(1,pos,neg);
    cout<<pos+neg<<endl;
    return 0;
}
// vx公众号关注TechGuide 实时题库 闪电速递
Python版本
import math
n = int(input())
ans = 0
p = math.floor(math.log(n, 2))
for i in range(p):
    ans += (i + 1) * math.pow(2, i)
ans += (p + 1) * (n + 1 - math.pow(2, p))
print(int(ans))
# vx公众号关注TechGuide 实时题库 闪电速递
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值