笔试算法题公司真题记录

快手2020春招第一题
#整数N划分为K份,求K个数字的最大乘积 例如 整数7分3份 最大2*2*3=12
思路:均值不等式 ab<=1/2(a^2+b^2) a和b相等时乘积最大

N,K=[int(i) for i in input().split()]
#a为每份平均数字,b为最后的余数
a=N//K
b=N%K
sum=1
#0到i-1次因子都为a,最后一次因子为a+b
for i in range(K-1):
    sum*=a
sum=sum*(a+b)
print(sum)

快手2020春招第二题
给定一个矩阵m,从左上角开始每次只能向右走或者向下走,最后达到右下角的位置,
路径中所有数字累加起来就是路径和,返回所有路径的最小路径和;
例[[1,2,3],[4,5,6],[7,8,9]] 输出21

思路:假设是m行n列的矩阵,用dp[m][n]来抽象这个问题
dp[i][j]表示的是从原点到i,j位置的最短路径和。我们首先计算第一行和第一列,直接累加即可。
那么对于其他位置,要么是从它左边的位置达到,要么是从上边的位置达到,我们取左边和上边的较小值,然后加上当前的路径值。

def func(A):
    dp = [None]*len(A)
    for i in range(len(A)):
        dp[i]=[0]*len(A[0])
    dp[0][0]=A[0][0]
    print(dp)
    for i in range(len(A)):
        for j in range(len(A[0])):
            if i==0:
                dp[i][j]=dp[i][j-1]+A[i][j]
            elif j==0:
                dp[i][j]=dp[i-1][j]+A[i][j]
            else:
                if dp[i-1][j] > dp[i][j-1]:
                    dp[i][j]=dp[i][j-1]+A[i][j]
                else:
                    dp[i][j]=dp[i-1][j]+A[i][j]
    return dp[len(A)-1][len(A[0])-1]
A=[[1,2,3],[4,5,6],[7,8,9]]
print(func(A))

美团春招第二题
在这里插入图片描述
AC代码:

n,m=[int(i) for i in input().split()]
lis=[int(i) for i in input().split()]
min = min(lis)
sum=0
i=0
while m>=min:
    if i==n-1:
        if m>=lis[i]:
            m=m-lis[n-1]
            sum=sum+1
            i=0
        else:
            i=0
    else:
        if m>=lis[i]:
            m=m-lis[i]
            sum+=1
            i=i+1
        else:
            i=i+1
print(sum)

美团春招第四题
在这里插入图片描述


vivo2020届春季校园招聘在线编程考试
第二题: 数位之积
现给定任意正整数 n,请寻找并输出最小的正整数 m(m>9),使得 m 的各位(个位、十位、百位 … …)之乘积等于n,若不存在则输出 -1。
思路:如果n是个位数,则直接返回10+n; 如果n大于10:从9到2寻找它的因子,只要可以整除,则进行整除,并将对应因子累加到最后结果。如果最后n==1说明可以整除完整,返回结果值;否则返回-1.
AC代码

sum=0
num=1
if n<10:
        return 10+n
for i in range(9,1,-1):
    while n%i==0:
        sum+=i*num
        n=n/i
        num*=10
if n==1:
    return sum
else:
    return -1

第三题:
在vivo产线上,每位职工随着对手机加工流程认识的熟悉和经验的增加,日产量也会不断攀升。假设第一天量产1台,接下来2天(即第二、三天)每天量产2件,接下来3天(即第四、五、六天)每天量产3件 … … 以此类推,请编程计算出第n天总共可以量产的手机数量。
思路:1*1+2*2+3*3+*** +k*(n-(i-k)) 天数小于总天数时循环 最终留下来的几天 每天卖k台。
AC代码:

sum=0
i=1  #第多少天
k=1  #每天卖多少台
while i<=n:
    sum+=k*k
    k=k+1
    i=i+k
sum+=(n-(i-k))*k     #最终留下部分天数n-(i-k)  每天卖k台   加上
return sum
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章