【Keep】2019校招第二批-Java/数据/算法工程师(平板支撑、各位数之和、收集沙子)
这题没想到快捷方法,就用普通方法做了,先查询是否在数组中,如果在就返回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:]))