算法题--华为od机试考试(最大坐标值、寻找最富裕的小家庭、两个字符串间的最短路径问题)

目录

最大坐标值

题目描述

输入描述

输出描述

示例1

输入

输出

说明

解析

答案

寻找最富裕的小家庭

题目描述

输入描述

输出描述

示例1

输入

输出

说明

解析

答案

两个字符串间的最短路径问题

题目描述

​编辑

输入描述

输出描述

示例1

输入

输出

示例2

输入

输出

解析

答案


最大坐标值

考察参数校验,简单循环。

题目描述

小明在玩一个游戏,游戏规则如下:

在游戏开始前,小明站在坐标轴原点处(坐标值为0)。给定一组指令和一个幸运数,每个指令都是一个整数,小明按照指定的要求前进或者后退指定的步数。前进代表朝坐标轴的正方向走,后退代表朝坐标轴的负方向走。

幸运数为一个整数,如果某个指令正好和幸运数相等,则小明行进步数加1。

例如

幸运数为3,指令为[2,3,0,-5]

指令为2,表示前进2步;

指令为3,正好和幸运数相等,前进3+1=4步;

指令为0,表示原地不懂,既不前进,也不后退;

指令为-5,表示后退5步;

请你计算小明在整个游戏过程中,小明所处的最大坐标值。

输入描述

第一行输入一个数字,代表指定的总个数n(1<=n<=100)。

第二行输入一个数字,代表幸运数m(-100<=m<=100)。

第三行输入n个指定,每个指令值的取值范围为:-100<=指令值<=100.

输出描述

在整个游戏过程中,小明所处的最大坐标值。异常情况下输出:12345

示例1

输入

2

1

-5 1

输出

0

说明

总共 2 个指令,幸运数为 1 ,依照指令行进,依次如下:

游戏开始前,站在坐标轴原点,此时坐标值为 0 ;

指令为 −5 ,后退 5 步 ,此时坐标值为 −5 ;

指令为 1 ,正好等于幸运数,前进 1+1=2 步,此时坐标值为 −3;

整个游戏过程中,小明所处的坐标值依次为[0,−5,−3],最大坐标值为 0 。

解析

首先对每个参数m、n、n个指令进行一一校验。再通过for循环记录每次的位置,从中选出最大的位置。

答案

function getMaxCoordinate(str) {let arr = str.split('\n')let [n, m, instructs] = arrinstructs = instructs.split(' ').map(Number);// 参数校验if (n > 100 || n < 1 || 100 < m || m < -100 || instructs.length != n || instructs.some(v => !Number.isInteger(v))) {return 12345}let max = 0let cur = 0for (let i = 0; i < n; i++) {cur = instructs[i] == m ? cur + instructs[i] + 1 : cur + instructs[i]if (cur > max) {max = cur}}return max
}
console.log(getMaxCoordinate(`2
1
-5 1`))

寻找最富裕的小家庭

考察深度优先、递归、hash

题目描述

在一棵树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,

一个节点及其直接相连的子节点被定义为一个小家庭现给你一棵树,请计算出最富裕的小家庭的财富和。

输入描述

第一行为一个数N,表示成员总数,成员编号1-N,1<=N<=1000

第二行为N个空格分隔的数,表示编号1- N 的成员的财富值。 0 <= 财富值 <= 1000000

接下来 N-1 行,每行两个空格分隔的整数(N1,N2), 表示 N1 是 N2 的父节点

输出描述

最富裕的小家庭的财富和

示例1

输入

4

100 200 300 500

1 2

1 3

2 4

输出

700

说明

解析

首先通过哈希的key-value建立每个节点的联系,value代表当前节点的财富值,next表示他的直接子节点,pre表示父节点。

然后通过判断节点是否存在父节点来选出根节点,再从根节点开始通过深度优先遍历每个节点,计算每个节点当前的财富和,取出最大的财富和。

注意叶节点的财富和不可能大于父节点的财富和,所以可以过滤掉。

答案

function getMaxNum(str) {let arr = str.split('\n')let len = arr.shift()let nodes = arr.shift().split(' ').map(Number)let hash = {}arr.forEach(v => {v = v.split(' ')if (!hash[v[0]]) {hash[v[0]] = { value: nodes[v[0] - 1], next: [] }}if (!hash[v[1]]) {hash[v[1]] = { value: nodes[v[1] - 1], next: [] }}hash[v[0]].next.push(hash[v[1]])hash[v[1]].pre = hash[v[0]]})// 通过判断节点是否存在父节点来选出根节点let root = Object.values(hash).find(v => !v.pre)return bfs(root)}
function bfs(root, max = 0) {if (!root.next.length) {// 叶节点的财富和不可能大于父节点的财富和,所以可以过滤调return}// 计算当前节点的财富和let cur = root.value + root.next.reduce((t, v) => t + v.value, 0)if (cur > max) {max = cur}// 遍历子节点的财富和root.next.forEach(v => {let tmp = bfs(v, max)if (tmp > max) {max = tmp}})return max
}
console.log(getMaxNum(`4
100 200 300 500
1 2
1 3
2 4`))

两个字符串间的最短路径问题

考察深度遍历、递归或动态规划。

题目描述

给定两个字符串,分别为字符串A与字符串B。例如A字符串为ABCABBA,B字符串为CBABAC。可以得到m*n的二维数组,

定义原点为(0,0),终点为(m,n),水平与垂直的每一条边距离为1,

从原点(0,0)到(0,A)为水平边,距离为1,从(0,A)到(A,C)为垂直边,距离为1;

假设两个字符串同一位置的两个字符相同则可以作一个斜边、如(A,C)到(B,B)最短距离为斜边,距离同样为1。

作出所有的斜边,则有(0,0)到(B,B)的距离为 1个水平边+1个垂直边+1个斜边=3。

根据定义可知,原点到终点的最短距离路径如下图红线标记,最短距离为9;

路径为(0,0)->(A,0)->(A,C)->(B,B)->(C,B)->(A,A)->(B,A)->(B,B)->(A,A)->(A,C)

输入描述

空格分割的两个字符串A与字符串B,字符串不为”空串”。

字符格式满足正则规则:[A-Z] 字符串长度<= 10000

输出描述

原点到终点的最短距离

示例1

输入

ABC ABC

输出

3

示例2

输入

ABCABBA CBABAC

输出

9

解析

方法一

使用深度遍历(递归)来查找最短路径。

我们用f(x,y)表示表示当前点x,y到终点的最短路径,首先需要找到f(x,y)和下一次的关系。每次走只能向右或者向下或者45度斜线,所以f(x,y)=Math.min(f(x+1,y),f(x,y+1),f(x+1,y+1))+1

需要判断什么情况下可以向右(x轴未到边界),向下(y轴未到边界),45度斜线(x+1,y+1对应的字母相同)。

找终点。

    1.当x,y等于对应的终点点。

    2.当当前步数已经超过了已经成功的最小步数。

方法二

使用动态规划来查找最短路径。

用二维数组arr[y][x]表示到0,0点的最短路径。

1.首先赋默认值当y等于0时,arr[0][x]=x,当x等于0时,arr[y][0]=y。

2.找到arr[y][x]和下一级的联系,即arr[y][x]=Math.min(arr[y-1][x],arr[y][x-1],arr[y-1][x-1])+1。其中arr[y-1][x-1]只有在x,y对应

的字母相同时出现。

答案

// 方法一深度遍历(递归)
function getMinPath(str){let [x,y] = str.split(' ')x = x.split('')y = y.split('')let endx = x.lengthlet endy = y.lengthreturn bfs(0,0,endx,endy,x,y)
}
function bfs(curx,cury,endx,endy,x,y,min=Infinity,step=0){if(curx===endx&&cury===endy){// 到达终点return step}if(step>=min){// 已走步数大于已经成功的最小值return}let tmpif(x[curx]===y[cury]){// 45度向下走tmp = bfs(curx+1,cury+1,endx,endy,x,y,min,step+1)if(tmp<min){min = tmp}}if(curx<endx){// 向右走一步tmp = bfs(curx+1,cury,endx,endy,x,y,min,step+1)if(tmp<min){min = tmp}}if(cury<endy){// 向下走一步tmp = bfs(curx,cury+1,endx,endy,x,y,min,step+1)if(tmp<min){min = tmp}}return min
}
// 方法二动态规划
function getMinPath(str){let [x,y] = str.split(' ')x = x.split('')y = y.split('')let endx = x.lengthlet endy = y.lengthlet pathArr = new Array(endy+1).fill(0).map(v=>new Array(endx+1).fill(0))pathArr[0]=pathArr[0].map((v,i)=>i)for(let i = 0;i<=endy;i++){pathArr[i][0]=i}for(let i=1;i<=endy;i++){for(let j=1;j<=endx;j++){if(y[i-1]===x[j-1]){pathArr[i][j]=Math.min(pathArr[i-1][j],pathArr[i][j-1],pathArr[i-1][j-1])+1}else{pathArr[i][j]=Math.min(pathArr[i-1][j],pathArr[i][j-1])+1}}}return pathArr[endy][endx]
}
console.log(getMinPath(`ABC ABC`))
console.log(getMinPath(`ABCABBA CBABAC`))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/360730.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

discuz插件之优雅草超级列表互动增强v1.2版本更新

https://doc.youyacao.com/9/2142 v1.2更新 discuz插件之优雅草超级列表互动增强v1.2版本更新 [title]20220617 v1.2发布[/title] 增加了对php8的支持 增加了 对discuz3.5的支持

设计模式——桥接模式

桥接模式(Bridge) 在学习面向对象的过程中&#xff0c;可能会陷入一个误区&#xff0c;只要可以用&#xff0c;都用上继承&#xff0c;就好比因为有了新锤子&#xff0c;看什么东西都像是钉子了。   事实上&#xff0c;继承可能会带来一些麻烦。比如对象的继承关系是在编译阶…

ThreeJS-截屏下载pdf或者图片时白屏

JS-页面截图下载为pdf 关于如何下载为 pdf 在上面的这篇文章中有写&#xff0c;大家可以看下&#xff0c;下载图片代码在最下面 这时我们发现 three 部分是空白的如下&#xff1a; 这就多少有点尴尬了&#xff0c;这时我们习惯性的看下后台报错 是不是发现了惊喜&#xff0c;…

AI在肿瘤学临床决策中的应用:一种多模态方法

在临床肿瘤学领域&#xff0c;多模态人工智能&#xff08;AI&#xff09;系统通过解读各类医学数据&#xff0c;展现出提升临床决策的潜力。然而&#xff0c;这些模型在所有医学领域中的有效性尚未确定。本文介绍了一种新型的多模态医疗AI方法&#xff0c;该方法利用大型语言模…

突发!OpenAI停止不支持国家API,7月9日开始执行

6月25日凌晨&#xff0c;有部分开发者收到了OpenAI的信&#xff0c;“根据数据显示&#xff0c;你的组织有来自OpenAl目前不支持的地区的API流量。从7月9日起&#xff0c;将采取额外措施&#xff0c;停止来自不在OpenAI支持的国家、地区名单上的API使用。” 但这位网友表示&am…

WordPress如何删除前端评论中的网址字段?

前面跟大家分享的『WordPress插件Comment Link Remove and Other Comment Tools&#xff0c;删除评论网址字段』一文&#xff0c;通过安装插件可轻松删除前端评论中的网址字段&#xff0c;不过有些站长不喜欢安装插件&#xff0c;那么是否可以通过纯代码去掉网址字段呢&#xf…

Harbor本地仓库搭建004_Harbor配置管理功能_分布式分发功能_仓库管理_用户管理_垃圾清理_审查服务_项目定额---分布式云原生部署架构搭建00

然后我们再看一下配置管理,这里主要有个认证模式 这里我们是数据库,其实就是我们安装的postgresql 可以看到还有LDAP对吧,这个其实就是自己公司如果有 LDAP服务器,那么可以对接过来,那么,这个时候 再登录harbor的时候,就可以直接使用公司的,LDAP来管理,所有的用户了,其实就是…

Golang | Leetcode Golang题解之第173题二叉搜索树迭代器

题目&#xff1a; 题解&#xff1a; type BSTIterator struct {stack []*TreeNodecur *TreeNode }func Constructor(root *TreeNode) BSTIterator {return BSTIterator{cur: root} }func (it *BSTIterator) Next() int {for node : it.cur; node ! nil; node node.Left {it…

CLion2024 for Mac[po] C和C++的跨平台解代码编辑器

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff08;适合自己的M芯片版或Intel芯片版&#xff09;&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功3、打开访达&#xff0c;点击【文…

【Deep Learning】Self-Supervised Learning:自监督学习

自监督学习 本文基于清华大学《深度学习》第12节《Beyond Supervised Learning》的内容撰写&#xff0c;既是课堂笔记&#xff0c;亦是作者的一些理解。 在深度学习领域&#xff0c;传统的监督学习(Supervised Learning)的形式是给你输入 x x x和标签 y y y&#xff0c;你需要训…

Android开发系列(十)Jetpack Compose之Card

Card是一种常用的UI组件&#xff0c;用于显示一个具有卡片样式的容器。Card组件通常用于显示列表项、卡片式布局或任何需要显示边框和阴影的UI元素。 使用Card组件&#xff0c;您可以轻松地创建带有卡片效果的UI元素。以下是一些Card组件的常见属性和功能&#xff1a; elevati…

【机器学习】对大规模的文本数据进行多标签的分类处理

1. 引言 1.1. NLP研究的背景 随着人工智能技术的飞速发展&#xff0c;智能助手、聊天机器人和虚拟客服的需求正呈现出爆炸性增长。这些技术不仅为人们提供了极大的生活便利&#xff0c;如日程管理、信息查询和情感陪伴&#xff0c;还在工作场景中显著提高了效率。聊天机器人凭…

Kivy tutorial 004: Making the GUI do stuff, binding to events

Kivy tutorial 004: Making the GUI do stuff, binding to events – Kivy Blog Central themes: Events and Kivy properties 中心主题&#xff1a;事件和kivy属性 We left the last tutorial with a calculator app GUI with some nice automatic behaviour, but which doe…

【自然语言处理系列】探索NLP:使用Spacy进行分词、分句、词性标注和命名实体识别,并以《傲慢与偏见》与全球恐怖活动两个实例文本进行分析

本文深入探讨了scaPy库在文本分析和数据可视化方面的应用。首先&#xff0c;我们通过简单的文本处理任务&#xff0c;如分词和分句&#xff0c;来展示scaPy的基本功能。接着&#xff0c;我们利用scaPy的命名实体识别和词性标注功能&#xff0c;分析了Jane Austen的经典小说《傲…

vue3+ts:监听dom宽高变化函数

一、效果展示 二、代码 getSize.ts import { ref, Ref, watchEffect } from "vue";export const getWidth (domRef: Ref<HTMLElement | null>) > {const width ref<number>(0);const height ref<number>(0);const observer new ResizeObs…

google浏览器无法访问大端口的处理方式

属性的目标中添加后缀内容或者修改后台端口为常用端口&#xff0c;比如8080等。 “C:\Program Files\Google\Chrome\Application\chrome.exe” --explicitly-allowed-ports8888

Matlab基础语法:变量和数据类型,基本运算,矩阵和向量,常用函数,脚本文件

目录 一、变量和数据类型 二、基本运算 三、矩阵和向量 四、常用函数 五、脚本文件 六、总结 一、变量和数据类型 Matlab 支持多种数据类型&#xff0c;包括数值类型、字符类型和逻辑类型。掌握这些基本的变量和数据类型&#xff0c;是我们进行数学建模和计算的基础。 数…

【Linux基础IO】深入理解缓冲区

缓冲区在文件操作的过程中是比较重要的&#xff0c;理解缓冲区向文件刷新内容的原理可以更好的帮助我们更深层的理解操作系统内核对文件的操作。 FILE 因为IO相关函数与系统调用接口对应&#xff0c;并且库函数封装系统调用&#xff0c;所以本质上&#xff0c;访问文件都是通过…

强化学习专题:强化学习知识梳理(一)

2024/6/23&#xff1a; 前段时间有幸完成了大学期间的第一篇论文。在面试之前复盘一下关于自己论文中DQN的一些相关点。 浅谈主要区别&#xff08;在线 or 离线&#xff09; 首先&#xff0c;一切的开始是强化学习中时序差分方程&#xff0c;这体现了强化学习方法的优化策略。在…

LED热管理

LED照明系统的热管理 本文提供了用于LED灯具的热管理系统。 包含LED轨道灯具包括照明组件、安装到照明组件上并具有多个孔的夹具壳体&#xff0c;以及将夹具壳体固定到轨道上的安装结构。 照明组件包括具有多个翅片的散热器、安装在所述散热器上的反射器、支撑在所述散热器上…