腾讯2020校招-技术研究类和数据分析-第三次笔试

腾讯的笔试题真的觉得比其他公司的笔试题难太多了,可能腾讯对这种基本功比较重视?

5道编程题 120分钟

总体来说,按LeetCode的难度来看,大概2道困难等级、3道中等等级


第一道(100%)

两组数组A和B,去掉A的某一个值,求在A和B中各拿一个数,最坏情况下,得到的最大的乘积。

注:看似简单,其实只要理清楚逻辑上的问题确实也不会太难,要考虑好数组中会存在负值,负负得正。而题目要求的最坏情况,其实也就是让你先找出没有去掉一个值的A和B能组成的最大乘积,然后去掉A的那个数之后,再去找到最大的乘积,其实就是两个找最大的过程。(其实在笔试的时候也没有理特别清楚,因为正负之间有点乱,所以取巧了一下,最后用一个max(A_min*B_min,A_max*B_max,A_max*B_min,A_min*B_max)强行AC,速度过题)

# 获取数值
a = input().split(' ')
n = int(a[0])
m = int(a[1])
# print(n,m)
A = input().split(' ')
B = input().split(' ')
for i in range(n):
    A[i] = int(A[i])
for i in range(m):
    B[i] = int(B[i])
# print(A,B)

# 求得A和B的最大最小值
A_min = min(A)
A_max = max(A)
B_min = min(B)
B_max = max(B)

# 按照条件去除A的值
if (A_min*B_min)<(A_max*B_max):
    inde = A.index(A_max)
    A.pop(inde)
    A_max = max(A)
else:
    inde = A.index(A_min)
    A.pop(inde)
    A_min = min(A)

# 取巧的地方,因为两个数组,不管正负,最大值一定在这4个最大最小的乘积里
print(max(A_min*B_min,A_max*B_max,A_max*B_min,A_min*B_max))

第二题 (20%)

给一组不存在重复的数组,甲从数组中选出两个数a和b,构成|a|到|b|的区间,接着乙的区间是|a-b|到|b-a|,问,再给出的这个数组中,乙的区间能包含住甲的区间的有多少中情况。

注:之前有印象做过一道类似的,但是实在想不起怎么解,所以直接码了个暴力解算了,所以只拿了0.2

n = int(input())
num = input().split(' ')
for i in range(n):
    num[i] = int(num[i])
result = 0
n = len(num)
for i in range(n-1):
    for j in range(i+1,n):
        # print(num[i],num[j])
        a = abs(num[i])
        b = abs(num[j])
        if b<=a:
            e = a
            a = b
            b = a
        c = abs(num[i]-num[j])
        d = abs(num[i]+num[j])
        # print(a,b,c,d)
        if c>d:
            e = c
            c = d
            d = e
        if c<=a and d>=b:
            result+=1
print(result)

第三题 (20%)

这道题就是非常常见的给一个数组,从中选k个,组成最大价值的问题

注:然而这么熟悉的题,但是一开始我直接用解背包问题的解法,直接用深搜搞出来一个超出内存限制。后面也没什么思路重新写。

result = 0

def depth(key,k,num,low):#目前能选的有什么,还能选多少个,累计关卡数,最低难度
    global result
    if k == 0 :
        score = num*low
        if score>result:
            result = score
        return

    if len(key)==0:
        return
    # 选
    if num!=0:
        if (num + key[-1][0])*(min(low, key[-1][1])) > (num*low) :
            depth(key[:-1], k - 1, num + key[-1][0], min(low, key[-1][1]))
    else:
        depth(key[:-1], k - 1, num + key[-1][0], min(low, key[-1][1]))
    # 不选
    depth(key[:-1], k, num , low)

a = input().split(' ')
n = int(a[0])
k = int(a[1])
key = []
for i in range(n):
    a = input().split()
    a[0] = int(a[0])
    a[1] = int(a[1])
    key.append(a.copy())
# print(key)
depth(key,k,0,10**6+1)
for i in range(len(key)-1):
    for j in range(i+1,len(key)):
        continue
print(result)

第四题(100%)

非常常见的题,leetcode和剑指好像都有,就是K进制的运算(2<=K<=35)

注:需要深刻检讨自己,太久没练,居然连‘A’到‘Z’都要手打出来,ASCII都不会转换了

def Kto(num_str,K):
    alb = ['A','B','C','D','E','F','G',
           'H','I','J','K','L','N','M',
           'O','P','Q','R','S','T',
           'U','V','W','X','Y','Z']
    num = 0
    # print('>',num_str)
    num_list = list(num_str)
    # print(type(num_list[0]))
    for i in range(len(num_list)):
        # print(i)
        # print(num_list[i])
        if num_list[i]>='0' and num_list[i]<='9':
            num_list[i]=int(num_list[i])
        else:
            que = alb.index(num_list[i])
            num_list[i] = 10+que
    num_list.reverse()
    for i in range(len(num_list)):
        num += num_list[i]*(K**i)
    return num

def toK(num,K):
    if num == 0:
        return '0'
    i = 0
    while True:
        if K**i > num:
            break
        i+=1
    mi = i
    res = []
    # print(mi)
    lis = list(range(mi))
    lis.reverse()
    for i in lis:
        # print(i)
        a = num//(K**i)
        b = num%(K**i)
        num = b
        res.append(a)
    # print(res)
    alb = ['A','B','C','D','E','F','G',
           'H','I','J','K','L','N','M',
           'O','P','Q','R','S','T',
           'U','V','W','X','Y','Z']
    for i in range(len(res)):
        if res[i]>9:
            res[i] = alb[res[i]-9-1]
        else:
            res[i] = str(res[i])
    result = ''
    for i in res:
        result+=i
    return result

T = int(input())
result = []
for t in range(T):
    K = int(input())
    a = input().split(' ')
    # print(a[0])
    num1 = Kto(a[0],K)
    # print(a[1])
    num2 = Kto(a[1],K)
    num3 = 0
    if a[2]=='+':
        num3 = num1+num2
    elif a[2]=='-':
        num3 = num1-num2
    else:
        num3 = num1*num2
    res = toK(num3,K)
    # print(res)
    result.append(res)
for i in result:
    print(i)

第五题(70%)

给一个字符串列表,再给你str1和str2,按照字典顺序给出一个符合是str1为前缀而str2不为前缀的字符串。

注:因为那时候写到这道题的时候已经剩下最后半小时,前面还有两道还是20%,所以速度码了个暴力解,发现有70%,也就不管了,回去看那两个20%,然而事实证明,没用的,不用挣扎的。

def test(str1,qian):
    if len(str1)

 

你可能感兴趣的:(题库)