算法题--华为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

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav