8.31 顺丰笔试题(猜测序列题解)

顺丰的运筹优化工程师岗位,2道题,代码量极小。想明白原理后很容易A。

第一题:幸运数
小昱非常喜欢5这个数字,如果一个数在十进制表示下数字5出现了不少于5次,则是一个幸运数。例如,55555、152****55565就是幸运数;而5、123则不是幸运数。小昱想知道大于N的最小的幸运数是多少。
解法:看到这题懒得多想,暴力硬解即可。很明显最坏的复杂度只有10万。比如输入 155555,我需要遍历到 255555 。因此,必不可能超时。
n = int(input()) + 1
while str(n).count('5') < 5:
    n += 1
print(n)
第二题:猜测序列
小明有一个由1到n的整数组成的排列,他让你来猜出这个排列是什么。你每次可以猜测某一位置的数字,小明会告诉你所猜测的数是“大了”、“小了”或是“正确”。你想知道你在最坏情况下,需要猜测几次,才能在排列的所有位置都得到小明“正确”的回复?
这题其实看懂题难度大于写代码难度,解法想明白之后很好写。就拿样例输入 5, 输出 11 为例分析一下:
  • 首先,我猜第一个位置的数。它有 5 种可能性,采用二分猜测的方法,最坏情况下要猜 3 次、
  • 然后,第二个位置的数只剩下 4 种可能性,但最坏情况下依然要猜 3 次。
  • 第三个位置,只剩下 3 种可能性了,因此在 2 次之内一定能猜出来。
  • 同理,第四、第五个位置分别需要 2、1 次。总次数为 3+3+2+2+1 = 11
总结一下规律,对于有 k 种可能性的数字,最坏时需要 。我们需要求的是。其中,对于所有 ,均有
代码实现:使用循环,先把 1 到 2^p - 1 的f值求和,再加上 2^p 到 n 的f值即可 。复杂度为 O(log n)。
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))

#顺丰笔试##顺丰科技笔试#
全部评论
为什么你的题目第一题这么简单,我的试卷第一道是你的第二道😅
7 回复 分享
发布于 2022-08-31 22:18 广东
第二题公式
5 回复 分享
发布于 2022-09-01 10:43 广东
第二题这题目是真的难懂,按照他的说法他应该把题目改成如果采用最优的方式去猜,最坏结果需要猜几次。不然的话五个数最差的结果是5次而不是3次啊。
4 回复 分享
发布于 2022-09-01 09:46 浙江
请问为什么1到2^p-1的f值是(i+1)*2^i ?
3 回复 分享
发布于 2022-09-01 09:47 广东
感觉选择题比编程题难多了😂
2 回复 分享
发布于 2022-08-31 22:46 北京
想问下楼主是什么时候投的,我还没收到测评
1 回复 分享
发布于 2022-09-01 14:55 山东
第二题p是啥啊
点赞 回复 分享
发布于 2022-08-31 21:06 黑龙江
顺丰算法笔试确实蛮容易的
点赞 回复 分享
发布于 2022-08-31 21:16 北京
太强了,没看出来第一题可以暴力解,a了74%,第二题看出来规律了但是超时了只过了63%,最后提前一小时交卷
点赞 回复 分享
发布于 2022-09-01 11:55 内蒙古
圣诞树咋做,太难了
点赞 回复 分享
发布于 2022-09-01 14:31 北京
为什么你的题这么简单。。。
点赞 回复 分享
发布于 2022-09-01 14:59 广东
第二题这种思路可能不太对,我好像就是这种思路,但通过率只有45%,楼主当时确实是用这种方法测试通过了所有案例了吗?
点赞 回复 分享
发布于 2022-09-01 15:03 北京
欸我还是不太理解,第二题这个他不是让求最坏的情况吗,最坏的情况是该用二分法来求吗?比如说5个数是54321,然后我每次猜都是从小到大的猜,那不是应该一共要猜5+4+3+2+1=15次吗?这不才应该是最坏的结果吗?
点赞 回复 分享
发布于 2022-09-01 15:07 广东
{"pureText":"","imgs":[{"alt":"discuss_166****728427.jpeg","height":1623,"localSrc":"content://media/external/images/media/138082","src":"https://uploadfiles.nowcoder.com/message_images/20220902/165664256_1662083727999/discuss_1662083728427.jpeg","width":960}]}
点赞 回复 分享
发布于 2022-09-02 09:55 北京
你好,请问为什么要先使用循环,先把 1 到 2^p - 1 的f值求和,再加上 2^p 到 n 的f值? 这个p是什么意思
点赞 回复 分享
发布于 2022-09-03 14:57 天津

相关推荐

Java抽象带篮子:难蚌,点进图片上面就是我的大头😆
点赞 评论 收藏
分享
32 103 评论
分享
牛客网
牛客企业服务