筆試算法題公司真題記錄

快手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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章