腾讯的笔试题真的觉得比其他公司的笔试题难太多了,可能腾讯对这种基本功比较重视?
5道编程题 120分钟
总体来说,按LeetCode的难度来看,大概2道困难等级、3道中等等级
两组数组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))
给一组不存在重复的数组,甲从数组中选出两个数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)
这道题就是非常常见的给一个数组,从中选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)
非常常见的题,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)
给一个字符串列表,再给你str1和str2,按照字典顺序给出一个符合是str1为前缀而str2不为前缀的字符串。
注:因为那时候写到这道题的时候已经剩下最后半小时,前面还有两道还是20%,所以速度码了个暴力解,发现有70%,也就不管了,回去看那两个20%,然而事实证明,没用的,不用挣扎的。
def test(str1,qian):
if len(str1)