美团8.16笔试 算法类 2.5/4

💻题目:8道单选(20分),4道编程(80分)

❓第一题思路:可以简单理解为把一个数二进制表示里的1,赋给数组里的二进制表示里同一位置的0,问最多能赋多少个1,换句话说,把数组里的数想象成带有插槽的数,二进制表示中的0就是插槽,比如5,二进制表示101,有1个插槽。那所有数一共有多少个插槽(同一个位置算一个)就是把所有数与起来,要求的最大值就是把插槽填满。

比如:nums = [2, 7, 6, 10],与起来的结果是0010,那就需要1101来插,答案就是13

t = int(input())
for _ in range(t):
    n = int(input())
    nums = list(map(int, input().split()))
    _sum = sum(nums)
    _max = max(nums)
    for i in range(1, n):
        nums[0] = nums[0] & nums[i]
    ans = (1 << _max.bit_length()) - 1 - nums[0]
    print(_sum + ans, ans)

❓第二题思路:按照题目给的流程走就行,用eval()函数可以直接转换输入

❓第三题:跳过,输出NO:7.41%

❓第四题:O(N^2)算法:50%,大概思路是从后往前找,记录更小值出现的次数

n = int(input())
nums = list(map(int, input().split()))
if n <= 2:
    print(0)
else:
    cnt = 0
    for i in range(3, n):
        smaller_before = 0
        for j in range(i-1, -1, -1):
            if nums[j] < nums[i]:
                smaller_before += 1
            elif nums[j] > nums[i]:
                cnt += smaller_before
    print(cnt)

AC:2.5/4,对于不刷题也没有竞赛经验的我,后面两道确实有点难做了

全部评论
ps:没用AI,我是不怎么敢用
点赞 回复 分享
发布于 08-17 00:15 北京

相关推荐

评论
点赞
收藏
分享

创作者周榜

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