【Keep】2019校招第二批-Java/資料/演算法工程師(平板支撐、各位數之和、收集沙子)
阿新 • • 發佈:2018-12-20
這題沒想到快捷方法,就用普通方法做了,先查詢是否在陣列中,如果在就返回index,不在就新增,再返回index。 值得注意的是python的input().split的使用。
s,m = [k for k in input().split()] #s儲存一個帶有,的str型別,m也是一個str型別
#m=22
#s='21,23,25,26'
a = [int(n) for n in s.split(',')]
if int(m) in a:
print(a.index(int(m)))
else:
a.append(int(m))
a.sort()
print (a.index(int(m)))
AC了。
這題一開始不會,在同學的幫助下做出來了,首先各個位數之和,3位數的話,最大和是999,也就是9*3=27,所以如果輸入s>27,那麼一定就湊不出來,沒有這個整數,所以輸出-1的條件是s>9*d
。然後,要保證位數,第一位要排除0,最小從1開始。核心思想是要讓後面位儘可能從大的數取起,所以高位數就可以放小的數字,讓大的數字往後放。
s,d = [int(n) for n in input().split()]
#s,d = 26,4#8,4 #11,4
if s>9*d or s<0 or d<1:
print( -1)
elif d==1:
print(s)
else:
if s-9*(d-1)>0: #判斷最高位的數字,如果s>9*(d-1),說明後面幾位都要放99....,最高位放s-9*(d-1)
ans = s-9*(d-1)
else:
ans = 1 #不讓最高位放0吧..
s = s - ans
d = d-1
k = d
for i in range(k):
if s-9*(d-1)>=0:
ans = ans *10+(s-9*(d-1))
s = 9 * (d - 1) #s是剩餘的量
else:
ans = ans*10
d -= 1 #每次都移動一位
print(ans+s) #比如s,d=8,4輸出1007的情況,加上s(7), 如果是第一種情況s-9*(d-1)>=0,比如26對應的1799,最後s=0,ans+s也是對的。
當時沒AC,結束後改了好半天,應該是對的了。
這題類似leetcode第11題,水容器,不太一樣,還沒做出來,先貼一個錯誤的程式,之後補上。 (以下是錯誤的)
def maxArea(height):
maxarea,l,r = 0,0,len(height)-1
while l<r:
maxarea = max(maxarea,min(height[l],height[r])*(r-l)-sum(height[l:r]))
if height[l]<height[r] :
l+=1
else:
r-=1
return maxarea
"""
def maxArea(height):
L, R, width, res = 0, len(height) - 1, len(height) - 1, 0
l,r = L,R
for w in range(width, 0, -1):
if height[L] < height[R]:
if res>height[L] * w-sum(height[L:R]):
r = R
res, L = max(res, height[L] * w-sum(height[L:R])), L + 1
else:
if res>height[R] * w-sum(height[L:R]):
l = L
res, R = max(res, height[R] * w-sum(height[L:R])), R - 1
return res
#h = [1,8,6,2,5,4,8,3,7]
h = [0,2,0,3,1,2,0,2,1,4,2,1]
print(maxArea(h))
print(maxArea(h[:]))
#print(maxArea(h[9:]))