快手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