算法题--华为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] = arr
    instructs = 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 = 0
    let cur = 0
    for (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.length
    let endy = y.length
    return 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 tmp
    if(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.length
    let endy = y.length
    let 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`))

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

类和对象(封装、继承、多态、友元)

c面相对象的三大特性为&#xff1a;封装、集成、多态 c 认为万事万物都皆为对象&#xff0c;对象上有其属性和行为 一、类和对象&#xff08;封装&#xff09; &#xff08;一&#xff09;封装的意义 封装是c面相对象的三大特性之一 封装的意义&#xff1a; 将属性和行为…

【应用开发一】LED开发

文章目录 1应用层控制外设的两种方式2 sysfs和/sys关系3 LED控制方式3.1 基本情况3.2 LED属性文件介绍3.3 命令行属性测试3.4 led程序3.5 开发板上测试 1应用层控制外设的两种方式 使用设备文件控制 在Linux系统下&#xff0c;一切皆是文件。应用层控制底层硬件同样也是通过文…

HarmonyOS开发 - 日志打印

在程序开发过程中&#xff0c;日志输出是不可或缺的一部分。能有效的记录和分析日志数据&#xff0c;使开发人员可以更好地了解程序的运行状况、解决问题、优化性能并满足合规性要求等。 当程序出现错误或异常时&#xff0c;日志记录输出可以帮助开发人员快速定位问题发生的位置…

Docker 从入门到精通(大全)

一、概述 1.1 基本概念 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。…

基于CRITIC-TOPSIS法的各地区评价

1.CRITIC-TOPSIS法原理 1.1 基本理论 CRITIC-TOPSIS法是一种结合CRITIC&#xff08;Criteria Importance Through Intercriteria Correlation&#xff09;法和TOPSIS&#xff08;Technique for Order Preference by Similarity to Ideal Solution&#xff09;法的综合评价方法…

全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动顺利开展

6月21日&#xff0c;省教育评估院在四川邮电职业技术学院组织开展全省高等职业学校大数据技术专业建设暨专业质量监测研讨活动。省教育评估院副院长赖长春&#xff0c;四川邮电职业技术学院党委副书记、校长冯远洪&#xff0c;四川邮电职业技术学院党委委员、副校长程德杰等出席…

【ONLYOFFICE8.1桌面编辑器】强势来袭—— 一款全面的办公软件套件

在日常工作和学习中&#xff0c;我们经常需要处理各种文档、表格和演示文稿。一款功能强大、易于使用的办公软件成为我们提高工作效率、便捷沟通和展示想法的得力助手。 而ONLYOFFICE 8.1桌面编辑器正是一款全面、高效的办公软件&#xff0c;集合了Word、PPT、Excel的功能&…

ubuntu的不同python版本的pip安装及管理

ubuntu的不同python版本的pip安装及管理_ubuntu 安装两个pip-CSDN博客https://blog.csdn.net/qq_32277533/article/details/106770850

抖音直播违规规定有哪些?(直播违禁词汇总表)

全民直播的同时也有不少新手直播玩家处处碰壁,直播间没人气,直播不知道说什么甚至直播间被封。 收到直播封禁通知的朋友,轻者封禁直播账号两三天,严重着可能永久封禁直播间! 今天我们重点来说说直播间被封是怎么回事?如何避免抖音直播间被封?抖音直播间违规规定有哪些?抖音…

[spring] Spring MVC Thymeleaf(下)

[spring] Spring MVC & Thymeleaf&#xff08;下&#xff09; 上篇笔记讲了一下怎么使用 thymeleaf 作为 HTML 模板&#xff0c;与 Spring MVC 进行沟通&#xff0c;这里主要说一下验证的部分 常用表单验证 一些 Spring MVC 内置的常用验证注解如下&#xff1a; Annota…

Redis 7.x 系列【6】数据类型之字符串(String)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 前言2. 常用命令2.1 SET2.2 GET2.3 MSET2.4 MGET2.5 GETSET2.6 STRLEN2.7 SETEX2.8…

8.12 矢量图层面要素单一符号使用七(随机标记填充)

文章目录 前言随机标记填充&#xff08;Random Marker Fill&#xff09;QGis设置面符号为随机标记填充&#xff08;Random Marker Fill&#xff09;二次开发代码实现随机标记填充&#xff08;Random Marker Fill&#xff09; 总结 前言 本章介绍矢量图层线要素单一符号中使用随…

解决node: bad option: -V

出现这个问题是由于我们的不当操作造成的&#xff0c;v是需要小写的&#xff0c;看下图 node --version node -v

KT6368A-sop8蓝牙主机芯片获取电动车胎压传感器数据功能

KT6368A蓝牙芯片新增主机模式&#xff0c;扫描周边的胎压传感器&#xff0c;这里扮演的角色就是观察者。因为测试胎压传感器&#xff0c;发现它的广播模式可发现&#xff0c;不可连接 胎压传感器部分的手册说明如下&#xff0c;关于蓝牙部分的协议 实际蓝牙芯片收到的数据&…

JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

韩sir Cookie技术Cookie简单示意图Cookie常用方法Cookie创建Cookie读取JSESSIONID读取指定Cookie Cookie修改Cookie生命周期Cookie的有效路径Cookie作业布置Cookie注意事项Cookie中文乱码问题 Session技术Session原理示意图Session常用方法Session底层机制Session生命周期Sessi…

群智优化:探索BP神经网络的最优配置

群智优化&#xff1a;探索BP神经网络的最优配置 一、数据集介绍 鸢尾花数据集最初由Edgar Anderson测量得到&#xff0c;而后在著名的统计学家和生物学家R.A Fisher于1936年发表的文章中被引入到统计和机器学习领域数据集特征&#xff1a; 鸢尾花数据集包含了150个样本&#…

【激光雷达使用记录】—— 如何在ubuntu中利用ros自带的rviz工具实时可视化雷达点云的数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、查看雷达数据的 frame_id1. 查看雷达数据的话题2. 查看数据的frame_id 二、可视化雷达数据总结 前言 RViz&#xff08;ROS Visualization&#xff09;是机…

Etsy店铺销量持续增长?揭秘我的稳定运营秘诀

一、什么是Esty&#xff1f; 今天的这篇文章应该是很多Etsy的卖家都十分关心的。相信了解过Etsy平台的家人们都知道&#xff0c;Etsy主要是一个专注于手工制品、古董和创意商品的电子商务平台&#xff0c;更是全球利润最高的跨境电商平台。利润高就会吸引更多的人前来注册店铺…

音视频入门基础:H.264专题(4)——NALU Header:forbidden_zero_bit、nal_ref_idc、nal_unit_type简介

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

数字化转型第三步:数字化业务创新与发展,提升收入和利润

引言&#xff1a;之前笔者的文章发布了企业数字化转型业务部分&#xff0c;如【开源节流】如何通过数字化转型增强盈利能力&#xff1f;企业供应链数字化转型如何做&#xff1f;让企业盈利能力增强再飞一会 【财务数字化转型之底座】集团企业财务数据中台系统建设方案 等文章&a…