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

本文主要是介绍算法题--华为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,然后计算单词对应的数值进行相减即可。这样可以避免每一位依次比较。

答案

function sortTopProj(str) {let arr = str.split('\n')arr.shift()let [watch, star, fork, issue, mr] = arr.shift().split(' ').map(Number)arr = arr.map(v => {v = v.split(' ')let res = {}res.value = v.shift()res.num = v[0] * watch + v[1] * star + v[2] * fork + v[3] * issue + v[4] * mrreturn res})arr.sort(compareWord)arr.sort((a, b) => b.num - a.num)return arr.map(v => v.value).join(' ')
}
function compareWord({ value: a }, { value: b }) {let len = Math.max(a.length, b.length)a = a.padEnd(len, 'a')b = b.padEnd(len, 'a')// 将每一位对应的权重设置为100,然后计算补全后的单词对应的数值,例如abc=》1*100**2+2*100**1+3*100**0a = a.split('').reverse().reduce((t, v, i) => t = t + (v.charCodeAt() - 96) * 100 ** i, 0)b = b.split('').reverse().reduce((t, v, i) => t = t + (v.charCodeAt() - 96) * 100 ** i, 0)return a - b
}
console.log(sortTopProj(`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`))

 

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地址,取出每一个的目标层级位,进行判断是否和关键字相等。

答案

function getWordNum(str) {let arr = str.split('\n')arr.shift()let [n, word] = arr.pop().split(' ')arr = arr.map(v => v.split('/'))let sum = 0arr.forEach(v => {if (v?.[n] === word) {sum++}})return sum
}
console.log(getWordNum(`5
/com/cheese/no/pop
/lai/cheese
/apple
/cat/cloud/no/one
/la/apple/no/hot
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. 剩余的月饼不足以分配||无剩余月饼||月饼的下限大于上限

答案

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

这篇关于算法题--华为od机试考试(开源项目热度榜单、API集群负载统计、分月饼)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069030

相关文章

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke

如何在一台服务器上使用docker运行kafka集群

《如何在一台服务器上使用docker运行kafka集群》文章详细介绍了如何在一台服务器上使用Docker运行Kafka集群,包括拉取镜像、创建网络、启动Kafka容器、检查运行状态、编写启动和关闭脚本... 目录1.拉取镜像2.创建集群之间通信的网络3.将zookeeper加入到网络中4.启动kafka集群

SpringBoot项目引入token设置方式

《SpringBoot项目引入token设置方式》本文详细介绍了JWT(JSONWebToken)的基本概念、结构、应用场景以及工作原理,通过动手实践,展示了如何在SpringBoot项目中实现JWT... 目录一. 先了解熟悉JWT(jsON Web Token)1. JSON Web Token是什么鬼

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

Jenkins中自动化部署Spring Boot项目的全过程

《Jenkins中自动化部署SpringBoot项目的全过程》:本文主要介绍如何使用Jenkins从Git仓库拉取SpringBoot项目并进行自动化部署,通过配置Jenkins任务,实现项目的... 目录准备工作启动 Jenkins配置 Jenkins创建及配置任务源码管理构建触发器构建构建后操作构建任务

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的