算法题--华为od机试考试(整数对最小和、素数之积、找城市)

news2024/11/23 13:24:49

目录

整数对最小和

题目描述

注意

输出描述

示例1

输入

输出

说明

解析

答案

素数之积

题目描述

输入描述

输出描述

示例1

输入

输出

说明

示例2

输入

输出

说明

解析

找城市

题目描述

输入

输出

示例1

输入

输出

示例2

输入

输出

说明

解析

答案


整数对最小和

考察排序,数组拍平

题目描述

给定两个整数数组array1、array2,数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素,

现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值

注意

两对元素如果对应于array1、array2中的两个下标均相同,则视为同一对元素。

输入描述

输入两行数组array1、array2,每行首个数字为数组大小size(0 < size <= 100);

0 < array1[i] <= 1000

0 < array2[i] <= 1000

接下来一行为正整数k

0 < k <= array1.size() * array2.size()

输出描述

满足要求的最小和

示例1

输入

1 1 2 3

1 2 3 3

2

输出

4

说明

用例中,需要取2对元素

取第一个数组第0个元素与第二个数组第0个元素组成1对元素[1,1];

取第一个数组第1个元素与第二个数组第0个元素组成1对元素[1,1];

求和为1+1+1+1=4,为满足要求的最小和

解析

新建一个二维数组,数组的行列长度和array1、array2的长度对应,通过循环给数组的每一位赋值,

arr[i][j]表示的为一对元素的和,将二维数组拍平,然后按升序排列,取前k位的和即为满足要求的最小和。

答案

function calcPairSum(str){
    let arr = str.split('\n')
    let n = Number(arr.pop())
    let [array1,array2]=arr.map(v=>v.split(' ').map(Number))
    let len1 = array1.length;
    let len2 = array2.length
    arr = new Array(len1).fill(0).map(v=>new Array(len2).fill(0))
    for(let i = 0;i<len1;i++){
        for(let j = 0;j<len2;j++){
            arr[i][j]=array1[i]+array2[j]
        }
    }
    arr=arr.flat().sort((a,b)=>a-b)
    return arr.slice(0,n).reduce((t,v,i)=>t+v)
}
console.log(calcPairSum(`1 1 2 3
1 2 3 3
2`))

素数之积

考察数学素数定义

题目描述

RSA加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度,数据越大,安全系数越高,给定一个32位正整

数,请对其进行因数分解,找出是哪两个素数的乘积。

输入描述

一个正整数num

0<num <= 2147483647

输出描述

如果成功找到,以单个空格分割,从小到大输出两个素数,分解失败,请输出-1-1

示例1

输入

15

输出

35

说明

因数分解后,找到两个素数3和5,使得3*5=15,按从小到大排列后,输出3 5

示例2

输入

27

输出

-1-1

说明

通过因数分解,找不到任何索数,使得他们的乘积为27,输出-1-1

解析

function resolvePrimeNumber(n){
    for(let i=2;i<=n**0.5;i++){
        if(n%i===0){
            let tmp = n/i
            if(isPrime(tmp)&&isPrime(i)){
                return [tmp,i].sort((a,b)=>a-b).join(' ')
            }
        }
    }
    return '-1 -1'
}
function isPrime(n){
    for(let i=2;i<=n**0.5;i++){
        if(n%i===0){
            return false
        }
    }
    return true
}
console.log(resolvePrimeNumber(15))
console.log(resolvePrimeNumber(27))

找城市

考察深度遍历,递归,数组去重,字符串分割。

题目描述

一张地图上有n个城市,城市和城市之间有且只有一条道路相连:要么直接相连,要么通过其它城市中转相连(可中转一次或多次)。

城市与城市之间的道路都不会成环。 当切断通往某个城市 i 的所有道路后,地图上将分为多个连通的城市群,设该城市i的聚集度为DPi

(Degree of Polymerization), DPi = max(城市群1的城市个数, 城市群2的城市个数, … 城市群m的城市个数)。

请找出地图上 DP 值最小的城市(即找到城市 j,使得 DPj = min(DP1, DP2 … DPn) )

提示:如果有多个城市都满足条件,这些城市都要找出来(可能存在多个解)。

提示:DPi的计算,可以理解为已知一棵树,删除某个节点后,生成的多个子树,求解多个子树节点数的问题。

输入

每个样例:第一行有一个整数N,表示有N个节点。1<=N<=1000

接下来的N-1行每行有两个整数x,y,表示城市x与城市y连接。1<=x, y<=N

输出

输出城市的编号。如果有多个,按照编号升序输出。

示例1

输入

5

1 2

2 3

3 4

4 5

输出

3

示例2

输入

6

1 2

2 3

2 4

4 5

4 6

输出

2 4

说明

当切断通往城市3的所有道路后,1,2为一个城市群,4,5为一个城市群,DPi为2,此时DPi为其它Dpi中最小的,所以为城市3

解析

通过深度遍历,每次遍历一个元素就将该元素加入一个数组,遍历完后再将这个元素加入一遍,这样我们通过该元素分割时就可以拿到切断该元素后的相连的节点。

例如上图(示例2),我们通过上面遍历方法得出的数组为[1,2,3,2,4,5,4,6,4,2,1]。然后我们将这个数组形成一个环,这样对每个数进行切割后得到的数组内去重后就是一个城市群,例如对2进行切割,可以拿到[1],[3],[4,5,4,6,4],[1]然后由于是环,所以第一个和最后一个是一组,最后去重后就是分组结果[1][3][4,5,6],所以可以得到DPi为3即取[4,5,6]。

答案

function getDP(str) {
    let arr = str.split('\n')
    let n = arr.shift()
    let obj = {}
    arr.forEach(v => {
        v = v.split(' ')
        if (!obj[v[0]]) {
            obj[v[0]] = { value: v[0], next: [] }
        }
        if (!obj[v[1]]) {
            obj[v[1]] = { value: v[1], next: [] }
        }
        obj[v[0]].next.push(obj[v[1]])
        obj[v[1]].next.push(obj[v[0]])
    })
    let start = Object.values(obj).filter(v => v.next.length === 1)[0]
    let pathArr = dfs(start)
    let pathStr = pathArr.join(' ')
    let citys = uni(pathArr)
    let dp = Infinity
    let dpCitys = []
    for (let i = 0; i < n; i++) {
        let cur = citys[i]
        let tmp = pathStr.split(cur).map(v => v.split(' '))
        //第一个节点和最后一个节点合成一个
        tmp[0] = tmp[0].concat(tmp.pop())
        let dpi = 1
        tmp.forEach(v => {
            let tmpDpi = uni(v.filter(city => city !== '')).length
            if (tmpDpi > dpi) {
                dpi = tmpDpi
            }
        })
        if (dpi < dp) {
            dpCitys = [cur]
            dp = dpi
        } else if (dpi === dp) {
            dpCitys.push(cur)
        }
    }
    return dpCitys.sort((a, b) => a - b).join(' ')
}
function uni(arr) {
    return [...new Set(arr)]
}
function dfs(start, set = new Set(), res = []) {
    res.push(start.value)
    set.add(start)
    let next = start.next.filter(v => !set.has(v))
    next.forEach((v, i) => {
        dfs(v, set, res)
        // 每次遍历一个元素就将该元素加入一个数组,遍历完后再将这个元素加入一遍,
        // 这样我们通过该元素分割时就可以拿到切断该元素后的相连的节点。
        res.push(start.value)
    })
    return res
}
console.log(getDP(`5
1 2
2 3
3 4
4 5`))
console.log(getDP(`6
1 2
2 3
2 4
4 5
4 6
`))

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Paragon NTFS与Tuxera NTFS有何区别 Mac NTFS 磁盘读写工具选哪个好

macOS系统虽然以稳定、安全系数高等优点著称&#xff0c;但因其封闭性&#xff0c;不能对NTFS格式磁盘写入数据常被人们诟病。优质的解决方案是使用磁盘管理软件Paragon NTFS for Mac&#xff08;点击获取激活码&#xff09;和Tuxera NTFS&#xff08;点击获取激活码&#xff0…

基于Java的蛋糕预定系统【附源码+LW】

摘 要 当今社会进入了科技进步、经济社会快速发展的新时代。国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统购物方式采取了人工的管理方法&#xff0c;但这种管理方法存…

FreeRTOS信号量和互斥量

信息量 简介 信号量是一种解决同步问题的机制&#xff0c;可以实现对共享资源的有序访问。 前面介绍的队列(queue)可以用于传输数据&#xff1a;在任务之间、任务和中断之间。 消息队列用于传输多个数据&#xff0c;但是有时候我们只需要传递状态&#xff0c;这个状态值需要用…

关于bim数字孪生threejs中使用glb文件大小优化及加载慢的说明(笔记)

在用three.js开发的时候发现&#xff0c;稍微大一点的glb或者fbx文件加载的时候很慢很卡 一直不理解这个卡和慢取决于哪些条件&#xff0c;下面来详细说一下 1、关于模型 不是越大加载越卡顿&#xff0c;而是却决于三角面数量&#xff0c;当累计三角面数量达到3000万时会出现明…

基于SSM的大学生家教管理系统【附源码+LW】

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本大学生家教平台就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

Linux随记(十)

一、harborv2.6.4 --> harbor-offline-installer-v2.11.0-rc3 --> v2.9.4 – 随记 漏洞信息&#xff1a; CVE-2023-20902timing condition in Harbor 2.6.x and below, Harbor 2.7.2 and below, Harbor 2.8.2 and below, and Harbor 1.10.17 and below allows an atta…

shell编程实战

1.1 shell脚本编程的步骤 需求分析&#xff1a;确定功能 命令测试&#xff1a;确定脚本需要的关键命令 编辑脚本 测试脚本 1.2 操作 1.2.1 实验一 1.需求描述 (1)统计网络中的服务器的mac 注&#xff1a;ARP&#xff0c;地址解析协议 注&#xff1a; (2)检查哪些主机开…

乐队谱在哪里找 乐队功能谱怎么做 Guitar Pro8激活码 吉他谱软件

学习乐队谱对于音乐爱好者来说是一种极具乐趣和挑战的体验。无论是追溯经典曲目还是与其他乐手合作&#xff0c;乐队谱都是实现音乐梦想的必备工具。然而&#xff0c;要找到适合练习的乐队谱并制作出符合乐队演奏需求的功能谱并不容易&#xff0c;需要借助一些方法和工具。下面…

visual studio 2022配置和使用protobuf

上图证明&#xff0c;我真的测了好多遍&#xff0c;测了好多版本的protobuf&#xff0c;花了很多时间。不过好在最后在vs2022上测通了。 下载protobuf 这里是protobuf下载的地址。 Releases protocolbuffers/protobuf GitHub 个人使用的3.21.9这个版本才跑通的。 1、首先…

Linux中部署MySQL环境方法(仓库安装)

1.进入MySQL官网 2.进入MySQL社区版下载 3.使用yum方式下载MySQL 4.使找到对应系统的对应包的链接 复制 5.linux命令行中使用命令通过对应链接下载该软件包 rpm -i https://repo.mysql.com//mysql80-community-release-el9-1.noarch.rpm 警告&#xff1a;/var/tmp/rpm-tmp.so…

MySQL数据库——在Centos7环境安装

MySQL在Centos7环境安装 1.切换root用户 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c;安装好后&#xff0c;普通用户也能使用 2.卸载不要的环境 要将自己环境中有关mysql的全都删除&#xff0c;避免安装过程中被影响 ps axj | grep mariadb 先检查是否有mari…

【Linux进阶】windows和linux文件互传的两种方式

前言 我们在windows电脑上使用ssh工具&#xff08;比如Xshell&#xff09;来远程登录并使用linux云服务器的时候&#xff0c;难免要将我们的文件传输到linux服务器上&#xff0c;或者将linux服务器的文件传输到我们的windows电脑里&#xff0c;那么&#xff0c;我们要怎么来实…

解决VSCode无法用ssh连接远程服务器的问题

原因&#xff1a; 因为windows自带的ssh无法连接远程服务器&#xff0c;需要用git底下的ssh.exe。 搜了很久&#xff0c;试过很多方法&#xff0c;包括替换掉环境变量中的ssh&#xff0c;但是都无效&#xff0c;最后发现是要在VSCode中配置需要使用哪个ssh.exe。 步骤&#…

第0章_项目方案介绍

文章目录 第0章 项目方案介绍0.1 功能介绍0.2 硬件方案0.3 软件方案0.3.1 上位机方案0.3.2 **中控方案**0.3.3 **传感器方案**0.3.4 **技术难点** 第0章 项目方案介绍 0.1 功能介绍 本课程来自一个真实项目&#xff1a;多个气体传感器的管理。由于气体传感器比较昂贵&#xf…

vue中如何使用echarts和echarts-gl实现三维折线图

一、vue中使用三维折线图 效果图&#xff1a; 二、使用步骤 1.引入库 安装echarts 在package.json文件中添加 "dependencies": {"echarts": "^5.1.2""echarts-gl": "^1.1.1",// "echarts-gl": "^2.0.8…

axios之CancelToken取消请求

从 v0.22.0 开始&#xff0c;Axios 支持以 fetch API 方式—— AbortController 取消请求 此 API 从 v0.22.0 开始已被弃用&#xff0c;不应在新项目中使用 官网链接 1. 背景 最近项目中遇到一个场景&#xff0c;当连续触发一个请求时&#xff0c;如果是同一个接口&#xf…

通讯录项目的实现(基于顺序表)

前言 建议先看顺序表&#xff08;上卷&#xff09;、顺序表&#xff08;下卷&#xff09;&#xff0c;再来看本篇。 思路 通讯录就是由一条条联系人数据组成的。在一条联系人数据中会有一些相关信息&#xff1a;姓名、性别、年龄、电话、住址等。 在“顺序表&#xff08;上卷…

Ubuntu安装、更新和删除软件

Ubuntu安装、更新和删除软件 问题命令行直接安装、更新和删除软件命令行直接安装软件命令行直接更新软件命令行直接删除软件 手动下载后命令行安装、更新和删除软件手动下载后命令行安装软件手动下载后命令行更新软件手动下载后命令行删除软件 手动下载后在桌面环境下安装、更新…

RocketMQ快速入门:事务消息原理及实现(十)

目录 0. 引言1. 原理2. 事务消息的实现2.1 java client实现&#xff08;适用于spring框架&#xff09;2.2 springboot实现 3. 总结 0. 引言 rocketmq 的一大特性就是支持事务性消息&#xff0c;这在诸多场景中有所应用。在之前的文章中我们已经讲解过事务消息的使用&#xff0…

三星DRAM、NAND,“又双叒叕”带头涨价了

据韩国媒体《每日经济新闻》报道&#xff0c;三星电子计划在第三季度上调服务器DRAM和企业级NAND闪存的价格&#xff0c;涨幅预计在15%-20%&#xff0c;主要受人工智能(AI)需求激增的推动。这一举措有望提振公司下半年业绩。 据《经济日报》报道援引业内消息&#xff0c;由于厂…