选择题感觉是我刷的几套题里面最最基础、最最友好的一套题目,2道算法题也是。总体时间分配大概是20 45 45(前面晚进考场7分钟,是反面例子,大家不要学习!!!),预计分数280分左右。
这次AI岗选择题我觉得没有什么好说的新点。
第一道算法题考的试K-means变体,拆分成find_region()和find_cdn()两个步骤,交替进行,直到CDN候选序列不再变化。这里需要注意的点就是find_region划分簇的时候,如果一个城市到几个CDN点位距离相同,则CDN转发服务点序号选取最小的。不过这边我的AC率是90%,用Python3运行时长13ms,一个用例答案错误,我觉得题目在簇内定位新CDN点的时候需要补充一个约束,因此这边我提出一个问题。
问题:划分区域步骤制定了用户距离相同则取序号小的点的规则,但对于区域内迭代步骤,如果簇内总用户距离相同,没有指定需不需要按照原来的编号,还是取当前簇内序号最小的作为CDN地址。
下面是源代码:
python
# AC率90%,问题:划分区域制定了用户距离相同则取序号小的点的规则,但区域内迭代如果簇内总用户距离相同,没有指定需不需要按照原来的编号,
# 还是取簇内序号最小的作为CDN地址
def func():
# please define the python3 input here. For example: a,b = map(int, input().strip().split())
p = int(input())
xs = []
ys = []
us = []
for i in range(p):
x, y,u = map(float, input().split(","))
xs.append(x)
ys.append(y)
us.append(u)
q = int(input())
# please finish the function body here.
def find_region(cdn:list)->dict:
cdn.sort()
regions=dict()
for c in cdn:
regions.setdefault(c,[c])
for i in range(p):
if i in cdn:
continue
x0,y0=xs[i],ys[i]
min_index = cdn[0]
min_distance=((x0-xs[cdn[0]])**2+(y0-ys[cdn[0]])**2)**0.5
for c in cdn:
distance= ((x0-xs[c])**2+(y0-ys[c])**2)**0.5
if distance<min_distance:
min_index=c
min_distance=distance
regions[min_index].append(i)
return regions
def find_cdn(regions:dict)->list:
new_cdn=[]
for c,region in regions.items():
region.sort()
min_index = region[0]
min_distance=sum([us[r]*((xs[r]-xs[min_index])**2+(ys[r]-ys[min_index])**2)**0.5 for r in region])
for r2 in region:
distance=sum([us[r]*((xs[r]-xs[r2])**2+(ys[r]-ys[r2])**2)**0.5 for r in region])
if distance<min_distance:
min_index=r2
min_distance=distance
new_cdn.append(min_index)
new_cdn.sort()
return new_cdn
cdn_last = list(range(q))
cdn_iter=[]
regions_final=dict()
while cdn_last!=cdn_iter:
cdn_iter=cdn_last[:]
regions=find_region(cdn_iter)
cdn_last=find_cdn(regions)
regions_final=regions.copy()
# print(cdn_last)
# please define the python3 output here. For example: print().
# 按照横纵坐标依次重排
cdn_last.sort(key=lambda c:xs[i]*101+ys[i])
for c in cdn_last:
total_users=sum([us[r] for r in regions_final[c]])
print("{:.2f},{:.2f},{:.2f}".format(xs[c],ys[c],total_users))
if __name__=="__main__":
func()
第二道算法题是关于KV-Cache动态稀疏压缩的,是一个模拟和排序的基础问题,不需要numpy。我最后差几十秒没有成功提交,真的后悔当时晚进去7分钟!!!!!!
需要注意的是,注意力分数相同的时候按照l>h>pos的优先级筛选,直接按照1维列表的方式处理即可,最后5分钟我是在行、列、token位置定位的地方卡了一下,最后没来及交,其实行数l就是sort_indexi//(H*N),列数c就是sort_indexi%(H*N)//N(注意不是直接%H),填充的位置pos就是sort_indexi%N。
python
# 直接编写无numpy库版本
def func2():
# please define the python3 input here. For example: a,b = map(int, input().strip().split())
L, H, N, M = map(int, input().split())
ascores = []
for l in range(L):
HN_score = list(map(float, input().split()))
ascores += HN_score
pos = int(input())
# please finish the function body here.
remains = M - L * H
# print(f'remains:{remains}')
ascores_f = ascores[:]
index=list(range(len(ascores_f)))
index.sort(key=lambda i:ascores_f[i],reverse=True)
count=0
output=[[[pos] for j in range(H)] for i in range(L)]
for k in range(len(ascores_f)):
rem=index[k]%N
if rem!=pos:
count+=1
line=index[k]//(H*N)
column=index[k]%(H*N)//N
output[line][column].append(rem)
if count==remains:
break
# please define the python3 output here. For example: print().
lines=[]
for l in range(L):
line=[]
for h in range(H):
output[l][h].sort()
line.append(",".join([str(e) for e in output[l][h]]))
lines.append(line)
for line in lines:
print(" ".join(line))
if __name__ == "__main__":
func2()
最后的最后,有疑问和想法欢迎踊跃指出和交流!