华为研发岗AI方向9.9机考题复盘&分析

选择题感觉是我刷的几套题里面最最基础、最最友好的一套题目,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()

最后的最后,有疑问和想法欢迎踊跃指出和交流!

相关推荐
HackTwoHub1 小时前
AI自动化信息收集赋能渗透测试!集成多款主流扫描工具,多维智能评分,精准锁定高危资产
运维·人工智能·安全·web安全·网络安全·自动化·系统安全
明志数科1 小时前
具身智能数据工程观察:从集中式数采工厂到真实场景采集,数据供给路线正在转向
大数据·数据库·人工智能
AI人工智能+1 小时前
炫彩活体检测利用手机屏幕发出动态彩色光,通过分析人脸皮肤对红、绿、蓝光的次表面散射特性,区分真人与照片、视频、3D面具等伪造物
人工智能·深度学习·人脸识别·人脸活体检测·炫彩活体检测
小七在进步1 小时前
类和对象(一)
java·数据结构·算法
Y_Bk1 小时前
2026 ICPC EC网络预选赛第一场
算法
nanawinona1 小时前
先跑通小流程,再扩展量化功能
人工智能·python
hongyucai1 小时前
一个碗引发的血案
python·几何学·拓扑学
AI早餐汇1 小时前
京东高级副总裁胡喜:零售企业AI变革之路的探索与实践
大数据·人工智能·零售
云雀衔光1 小时前
多个 MCP Server 怎么编排:数据库 / Redis / Git / 飞书一把梭
java·数据库·人工智能·redis·git·语言模型·飞书