3.13百度计算机视觉算法研发工程师笔试

前面都是选择题,考察面很广,有线性代数,机器学习,图像处理等等,也有3个C++的题,但是我都是蒙的。。

一共两个编程题

第一题,balabala一堆什么异或算法。然后目的是把例如00111001这样的二进制串变成全是0。但是只能使用如00001111,010,1这样的连着的1才可以,也就是说,只需要统计有多少个连着的1的串就可以了。比如00111001,就是两个,给一个00111000和一个00000001,就可以得到全0。

解题思路:

用一个flags记录现在的情况(True代表之前是1,False代表之前是0),再有一个res统计连1的个数

从前往后遍历,如果遇到1,看一下flags是不是True,如果是True,则代表上一个字符也是1,这里的1和上个在一个字段里,直接continue,判断下一个字符。如果是False,则代表上一个字符是0,当前这个1是这段1的第一个1,所以需要res+1,同时flags变为True

如果遇到的是0,那么就把Flags变成False就可以了。

结果返回res就是连续的1的个数,也是需要操作的异或次数。

第二题

有一串正整数,为a0...ai...an,如果取ai,那么你就得到了分数(就是ai的大小),但同时要删掉所有的数值等于ai-1和ai+1的数字。问怎么选能得到最大的数值。例如对于1,2,3,3,4,正确的选法是取1,3,3这样数值是7。这里要注意的就是3是可以有多少取多少的。

解题思路就是先做一个字典,统计每个数字出现了几次。然后用一维动态规划dp。dp的定义就是在选取<=当前这个数值的所有数字的时候,最大的分数是多少分。那么我们首先要计算ai到底价值是多少,也就是ai*ai出现的个数(利用前面统计的字典),把这个价值记作score,然后计算score+dp[i-2]。这里说一下为什么是i-2,因为如果我们选取了ai,那么我们应该删除ai-1和ai+1,所以我们是不能考虑状态dp[i-1]的,而i+1和我们又没关系,所以这样计算就可以。然后dp[i]选取score+dp[i-2]与dp[i]的最大值就可以,分别对应的是选取ai和不选取ai(选取了ai-1)的结果

代码如下:

n = int(input())

a = list(map(int, input().split()))

num_count = {}

for num in a:

    num_count[num] = num_count.get(num, 0) + 1

max_num = max(a)

# print(max_num)

dp = [0] * (max_num+1)

dp[1] = num_count.get(1,0)

for i in range(2,max_num+1):

    score = i * num_count.get(i,0)

    if i > 2:

        score += dp[i - 2]

    dp[i] = max(dp[i-1], score)

print(dp[max_num])

#我的实习求职记录##软件开发2023笔面经#
全部评论
面哪个城市的
点赞 回复 分享
发布于 2023-03-21 22:34 四川

相关推荐

点赞 评论 收藏
分享
评论
4
21
分享

创作者周榜

更多
牛客网
牛客企业服务