• 算法题--华为od机试考试(开源项目热度榜单、API集群负载统计、分月饼)


    目录

    开源项目热度榜单

    题目描述

    输入描述

    输出描述

    示例1

    输入

    输出

    解析

    答案

    API集群负载统计

    题目描述

    输入描述

    输出描述

    示例1

    输入

    输出

    解析

    答案

    分月饼

    题目描述

    输入描述

    输出描述

    示例1

    输入

    输出

    说明

    示例2

    输入

    输出

    说明

    示例3

    输入

    输出

    说明

    解析

    答案


    开源项目热度榜单

    考察排序

    题目描述

    某个开源社区希望将最近热度比较高的开源项目出一个榜单,推荐给社区里面的开发者对于每个开源项目,开发者可以进行关注 (watch) 、收藏(star) 、fork、提issue、提交合并请求 (MR)等。

    数据库里面统计了每个开源项目关注、收藏、fork、issue、MR的数量,开源项目的热度根据这5个维度的加权求和进行排序。

    H = W(watch) x #watch + W(star) x #star + W(fork) x #fork + W(issue) x #issue + W(mr) x #mr

    H 表示热度值 W(watch)、W(star)、W(fork)、W(issue)、W(mr) 分别表示5个统计维度的权重。#watch、#star、#fork、#issue、#mr 分别表示5个统计维度的统计值.

    榜单按照热度值降序排序,对于热度值相等的,按照项目名字转换为全小写字母后的字典序排序(a,b,c...x,y,z)。

    输入描述

    第一行输入为N,表示开源项目的个数,0 < N <100。

    第二行输入为权重值列表,一共 5 个整型值,分别对应关注、收藏、fork、issue、MR的权重,权重取值 0< W<= 50。

    第三行开始接下来的N行为开源项目的统计维度,每一行的格式为: name nr_watch nr_start nr_fork nr_issue nr_mr。其中name为开源项目的名字,由英文字。

    输出描述

    排序后的项目名字。

    示例1

    输入

    4

    8 6 2 8 6

    camila 66 70 46 158 80

    victoria 94 76 86 189 211

    anthony 29 17 83 21 48

    emily 53 97 1 19 218

    输出

    victoria camila emily anthony

    解析

    先让每个项目通过字母排序,然后再通过热度值排序即可。

    字母排序可以通过将比较的两个单词补全到相同长度,然后将每一位对应的权重设置为>24,然后计算单词对应的数值进行相减即可。这样可以避免每一位依次比较。

    答案

    1. function sortTopProj(str) {
    2. let arr = str.split('\n')
    3. arr.shift()
    4. let [watch, star, fork, issue, mr] = arr.shift().split(' ').map(Number)
    5. arr = arr.map(v => {
    6. v = v.split(' ')
    7. let res = {}
    8. res.value = v.shift()
    9. res.num = v[0] * watch + v[1] * star + v[2] * fork + v[3] * issue + v[4] * mr
    10. return res
    11. })
    12. arr.sort(compareWord)
    13. arr.sort((a, b) => b.num - a.num)
    14. return arr.map(v => v.value).join(' ')
    15. }
    16. function compareWord({ value: a }, { value: b }) {
    17. let len = Math.max(a.length, b.length)
    18. a = a.padEnd(len, 'a')
    19. b = b.padEnd(len, 'a')
    20. // 将每一位对应的权重设置为100,然后计算补全后的单词对应的数值,例如abc=》1*100**2+2*100**1+3*100**0
    21. a = a.split('').reverse().reduce((t, v, i) => t = t + (v.charCodeAt() - 96) * 100 ** i, 0)
    22. b = b.split('').reverse().reduce((t, v, i) => t = t + (v.charCodeAt() - 96) * 100 ** i, 0)
    23. return a - b
    24. }
    25. console.log(sortTopProj(`4
    26. 8 6 2 8 6
    27. camila 66 70 46 158 80
    28. victoria 94 76 86 189 211
    29. anthony 29 17 83 21 48
    30. emily 53 97 1 19 218`))

     

    API集群负载统计

    考察数组操作

    题目描述

    某个产品的RESTful API集合部署在服务器集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,

    根据热点信息在服务器节点之间做负载均衡,现在需要实现热点信息统计查询功能。

    RESTful API是由多个层级构成,层级之间使用 / 连接,如 /A/B/C/D 这个地址,A属于第一级,B属于第二级,C属于第三级,D属于第四级。

    现在负载均衡模块需要知道给定层级上某个名字出现的频次,未出现过用0表示,实现这个功能。

    输入描述

    第一行为N,表示访问历史日志的条数,0 < N ≤ 100。

    接下来N行,每一行为一个RESTful API的URL地址,约束地址中仅包含英文字母和连接符 / ,最大层级为10,每层级字符串最大长度为10。

    最后一行为层级L和要查询的关键字。

    输出描述

    输出给定层级上,关键字出现的频次,使用完全匹配方式(大小写敏感)。

    示例1

    输入

    5

    /com/cheese/no/pop

    /lai/cheese

    /apple

    /cat/cloud/no/one

    /la/apple/no/hot

    2 cheese

    输出

    2

    解析

    通过/分割每个url地址,取出每一个的目标层级位,进行判断是否和关键字相等。

    答案

    1. function getWordNum(str) {
    2. let arr = str.split('\n')
    3. arr.shift()
    4. let [n, word] = arr.pop().split(' ')
    5. arr = arr.map(v => v.split('/'))
    6. let sum = 0
    7. arr.forEach(v => {
    8. if (v?.[n] === word) {
    9. sum++
    10. }
    11. })
    12. return sum
    13. }
    14. console.log(getWordNum(`5
    15. /com/cheese/no/pop
    16. /lai/cheese
    17. /apple
    18. /cat/cloud/no/one
    19. /la/apple/no/hot
    20. 2 cheese`))

    分月饼

    考察深度遍历、递归。

    题目描述

    中秋节,公司分月饼,m个员工,买了n个月饼,m<=n,每个员工至少分1个月饼,但可以分多个,单人分到最多月饼的个数是Max1,

    单人分到第二多月饼个数是Max2,Max1-Max2 <= 3,单人分到第n-1多月饼个数是Max(n-1),

    单人分到第n多月饼个数是Max(n),Max(n-1) – Max(n) <= 3, 问有多少种分月饼的方法?

    输入描述

    每一行输入m n,表示m个员工,n个月饼,m<=n

    输出描述

    输出有多少种月饼分法

    示例1

    输入

    2 4

    输出

    2

    说明

    分法有2种

    4=1+3

    4=2+2

    注意:1+3和3+1算一种分法

    示例2

    输入

    3 5

    输出

    2

    说明

    5=1+1+3

    5=1+2+2

    示例3

    输入

    3 12

    输出

    6

    说明

    满足要求的有6种分法:

    12=1+1+10(Max1=10,Max2=1,不满足要求)

    12=1+2+9(Max1=9, Max2=2, 不满足要求)

    12=1+3+8(Max1=8, Max2=3, 不满足要求)

    12=1+4+7(Max1=7, Max2=4, Max3=1,满足要求)

    12=1+5+6(Max1=6, Max2=5, Max3=1,不满足要求)

    12=2+2+8(Max1=8, Max2=2, 不满足要求)

    12=2+3+7(Max1=7, Max2=3, 不满足要求)

    12=2+4+6(Max1=6, Max2=4, Max3=2, 满足要求)

    12=2+5+5(Max1=5, Max2=2,满足要求)

    12=3+3+6(Max1=6, Max2=3, 满足要求)

    12=3+4+5(Max1=5, Max2=4, Max3=3,满足要求)

    12=4+4+4(Max1=4, 满足要求)

    解析

    首先我们需要从第一个员工开始分配,由于示例1中1+3和3+1算一种分法,所以我们可以假设从序号0到序号m-1个员工拿到的月饼为一个递增的序列。

    然后相邻的每个员工有一个限制条件,拿到月饼的范围,故可以得出函数的参数f(index,sum,down,up)表示序号为index的员工,sum为剩余的月饼数,

    down和up表示当前员工可以拿月饼的范围。

    找到f(index,sum,down,up)=f(index+1,sum-i,i,Math.min(i+3,sum-i)),其中i从down到up循环,表示为index员工拿到的月饼数。

    找终点。

        1.当index和m相等时,表示已经分配完了所有元,如果不剩月饼,此时应该把符合条件的分法加一。

        2. 剩余的月饼不足以分配||无剩余月饼||月饼的下限大于上限

    答案

    1. function getDispatchWay(m, n) {
    2. let res = 0;
    3. dfs(0, n, 1, n);
    4. // u表示当前员工的索引,sum表示剩余的月饼数,down和up表示当前员工分到的月饼数量的下限和上线
    5. function dfs(index, sum, down, up) {
    6. if (index === m) { // 如果u等于m
    7. if (sum === 0) { // 如果sum等于0
    8. res++; // 结果加一
    9. }
    10. return;
    11. }
    12. // 剩余的月饼不足以分配||无剩余月饼||月饼的下限大于上限
    13. if (down > sum || sum < 0 || down > up) {
    14. return;
    15. }
    16. // 当前序号的员工发放了i个月饼
    17. for (let i = down; i <= up; i++) {
    18. // 下一个员工分到月饼的上限不能大于剩余的月饼数或当前员工的月饼数量+3取最小值
    19. dfs(index + 1, sum - i, i, Math.min(sum - i, i + 3));
    20. }
    21. }
    22. return res
    23. }
    24. console.log(getDispatchWay(2, 4))
    25. console.log(getDispatchWay(3, 5))
    26. console.log(getDispatchWay(3, 12))

  • 相关阅读:
    JavaScript 多维数组构建与遍历以及示例和详细代码解释为什么这样写(1)
    测试行业3年经验,面试想拿 15K,HR说你只值 7K,该如何回答或者反驳?
    An动画基础之散件动画原理与形状提示点
    国际播客日 · 森海塞尔精选播客设备满足各类音频需求
    RocketMq源码分析(八)--消息消费流程
    数据结构之图(关键路径)
    详解欧拉计划第227题:追赶游戏
    CSPNet论文详解
    mysql5.7离线安装
    类和对象(上)
  • 原文地址:https://blog.csdn.net/AIWWY/article/details/139719866