华为机试 - 端口合并

news2024/11/17 13:19:17

目录

题目描述

输入描述

输出描述

用例

题目解析

算法源码


题目描述

有M(1<=M<=10)个端口组,
每个端口组是长度为N(1<=N<=100)的整数数组,
如果端口组间存在2个及以上不同端口相同,则认为这2个端口组互相关联,可以合并。
第一行输入端口组个数M,再输入M行,每行逗号分隔,代表端口组。
输出合并后的端口组,用二维数组表示。

输入描述

第一行输入一个数字M
第二行开始输入M行,每行是长度为N的整数数组,用逗号分割

输出描述

合并后的二维数组

用例

输入4
4
2,3,2
1,2
5
输出[[4],[2,3,2],[1,2],[5]]
说明仅有一个端口2相同,不可以合并。
输入3
2,3,1
4,3,2
5
输出[[1,2,3,4],[5]]
说明
输入6
10
4,2,1
9
3,6,9,2
6,3,4
8
输出[[10],[1,2,3,4,6,9],[9],[8]]
说明

题目解析

这道题看上去平平无奇,但是如果看用例得话,似乎大有深意。

比如用例3,如果只进行一次匹配得话,则只有3,6,9,2和6,3,4可以合并,但是用例结果显示,3,6,9,2和6,3,4合并后得结果还要继续和4,2,1合并,这就意味着一个双重for是不够的,比如

matrix = [arr1, arr2, arr3, arr4, arr5]

我们首先基于arr1,将arr1和它后面的arr2合并,如果可以合并,则先将arr1合并入arr2,再将arr1.length = 0 ,然后结束本轮,如果不可以合并,则接着分别和arr3、arr4、arr5合并。

然后基于arr2,将arr2和它后面的arr3合并,同上逻辑。

但是我们需要注意的是,如果第一轮时 arr1无法和其他端口组合并,那么arr1将保留,然后第二轮arr2和尝试和其他端口组合并,比如arr2和arr3可以合并,且合并后的arr3和arr1是可以合并的。

那么双重for的逻辑可以支持arr3再回头和arr1合并吗?答案是不可以的,因为外层for循环是不可逆的,因此我们必须再在双重for外面套一层循环。

我觉得使用while比较好,我们可以定义一个flag变量,初始为true,作为while的循环条件,当进入while循环后,立即将flag=false,然后进行上面双重for逻辑,只要有端口组发生合并,则将flag=true,如果双重for结束了,也没有端口组发生合并,那么就说明真的没有端口组可以合并了,因此flag保持为false,while结束。

这是端口组合并的大逻辑。

接下来就是端口组什么条件下合并?

如果端口组间存在2个及以上不同端口相同,则认为这2个端口组互相关联,可以合并。

按照题目意思,只要两个端口组之间有>=2个的相同端口,即可合并。

此时,我们应该尽量让合并判断的时间复杂度降低,因为外面已经有三层循环嵌套了。

这里,我们可以先将两个尝试合并的端口组,先进行升序排序,然后一层循环即可统计出相同端口的对数

 这样的话,就可以用O(n)的时间复杂度来判断两个端口组是否可以合并了。

接下来就是具体合并策略了,根据用例3可以发现,合并后的端口组是去重的,升序的,因此我们也要对合并后的端口进行去重升序。

但是,根据用例1输出的2,3,2来看,未合并的端口组是不能去重和排序的。

最终时间复杂度可以达到 O(m^3 * n),其中1<=m<=10,1<=n<=100,差不多10万次循环,还可以接受。

算法源码

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines = [];
let m;
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 1) {
    m = lines[0] - 0;
  }

  if (m && lines.length === m + 1) {
    lines.shift();
    const matrix = lines.map((line) => line.split(",").map(Number));

    console.log(getResult(matrix));

    lines.length = 0;
  }
});

function getResult(matrix) {
  let flag = true;
  while (flag) {
    flag = false;
    for (let i = matrix.length - 1; i >= 1; i--) {
      if (matrix[i].length > 1) {
        for (let j = i - 1; j >= 0; j--) {
          if (matrix[j].length > 1) {
            if (canMerge(matrix[i], matrix[j])) {
              matrix[j] = [...new Set([...matrix[i], ...matrix[j]])].sort(
                (a, b) => a - b
              );
              matrix[i].length = 0;
              flag = true;
              break;
            }
          }
        }
      }
    }
  }

  return matrix.filter((arr) => arr.length);
}

// 判断两个端口组是否可合并
function canMerge(m, n) {
  m = [...m].sort((a, b) => a - b);
  n = [...n].sort((a, b) => a - b);

  let i = 0;
  let j = 0;
  let count = 0;

  while (i < m.length && j < n.length && count < 2) {
    if (m[i] === n[j]) {
      i++;
      j++;
      count++;
    } else if (m[i] > n[j]) {
      j++;
    } else {
      i++;
    }
  }

  return count >= 2;
}

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

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

相关文章

CentOS部署主从DNS服务器

几个概念&#xff1a; 域名解析为IP地址&#xff1a;正向解析 IP地址解析为域名&#xff1a;反向解析 主DNS服务器&#xff1a;在特定区域内具有唯一性&#xff0c;负责维护该区域内的域名和IP地址之间的对应关系。 从DNS服务器&#xff1a;从服务器中获得域名和IP地址对应关系…

PCIE2PCI104载板转接卡

功能型号 PCIE2PCI104 此无源扩展卡允许开发人员将PCI104或PC/104plus卡安装到通用PCI总线系统中。适配器配备了一个堆栈式连接器。 功能描述 规格 适用于标准&#xff1a;Universal.3.3V或5V PCI插槽 工业温度工作范围&#xff1a;-40至85 C 连接器/接口&#xff1a;包括一个带…

干货 | 肖特基二极管4大特性

前言 肖特基二极管是重要的电子元器件&#xff0c;因为其承载着保护电路的重要作用&#xff0c;所以显得格外的不可或缺&#xff0c;我们都知道在选择肖特基二极管时&#xff0c;主要看它的正向导通压降、反向耐压、反向漏电流等。 但我们却很少知道其在不同电流、不同反向电压…

固定支撑约束在ANSYS有限元计算中的三大注意事项

固定支撑是在结构有限元中&#xff0c;大家最常用的一种约束条件了。如图1所示给出了设置固定支撑操作的方法。 图1 设置固定支撑操作方法 固定支撑约束&#xff0c;可以应用在点&#xff0c;线和面特征上。固定支撑表示被约束为位置为刚性&#xff0c;但是在现实工程结构中&a…

解决“Vector Hardware Manager无法连接This Computer”(能够独立解决问题,体现一个人的综合能力)

1. 引子 Vector Hardware Manager是先前配置工具Vector Hardware Config的继承者,是Vector Hardware Config工具的升级版或替代产品 什么是Vector Hardware Config? CANoe里打开: 界面: 而Vector Hardware Manager其实就是把Vector Hardware Config里的功能搬到了这里实…

UE5 + VS2022和UE4 + VS2019 编译踩坑

1&#xff0c;卡住且没有cl.exe进程 &#xff08;1&#xff09;&#xff0c;卸载Incredibuild&#xff0c;Incredibuild也是利用进程虚拟化技术&#xff0c;加速包括编译的方法&#xff0c;和firstbuild是一样的&#xff0c;所以优先选择了Incredibuild的方式&#xff0c;但是2…

PDF文件添加水印怎么添加?只需要两步轻松添加水印

PDF文件添加水印怎么添加&#xff1f;我们在处理工作文件时&#xff0c;都非常在意文件的隐私性&#xff0c;我们经常会使用一些方法来确保我们文件的内容不被别人窃取&#xff0c;其中一种方法就是给PDF文件添加水印&#xff0c;这样文件的内容就不会轻易被窃取了&#xff01;…

ControllerAdvice统一异常处理失效

问题描述 在common模块增加统一异常处理代码&#xff0c;如下。在service业务处理类中抛出异常&#xff0c; 但是接口返回的为spring统一的500错误。 package com.tea.common.exception; import com.tea.common.entity.ResponseResult; import com.tea.common.entity.Status…

基于java springboot的小说阅读微信小程序含后台管理系统源码

系统运行环境 开发工具 eclipse(idea)&#xff0c;mysql5.7&#xff08;大于5.5&#xff09;&#xff0c;navicat&#xff0c;小程序开发工具 硬件要求 windows操作系统 cpu&#xff1a;2.4GHz 内存&#xff1a;4G 硬盘&#xff1a;100G 开发及运行环境 windows10操作…

ArcGIS基础:栅格数据中的NoData数值(空值)的处理

先看下实验操作数据&#xff0c;也是原始数据&#xff0c;如下所示&#xff1a; 是一个非常普通的DEM栅格数据&#xff0c;中间空了一大块&#xff0c;也就是nodata&#xff0c;那么如果进行数据运算处理时&#xff0c;nodata值的像元是不参与&#xff0c;因此&#xff0c;需要…

Google Earth Engine(GEE)——将每小时降水量转化为逐日的降水量

很多时候我们获取影像的时间分辨率为逐小时,但是如何获取影像的累积降水量?这里的整体思路就是获取不同时间影像的时间序列,然后分别获取每天的降水量,最后同一秋累计值,如果要进行时序图片展示的情况,我们就可以再秋累计值的时候就可以建立一个时间属性,这样可以建立时…

【WebGL-iTwin.js】先导篇:用bentley-iTwin.js搭建模型在线可视化平台

一、先导篇说明 本篇博客为先导篇&#xff0c;方便快速搭建可视化平台。后面会慢慢补充WebGL相关的知识&#xff0c;理论原理和代码实战都会涉及&#xff0c;采用的技术是iTwin.js&#xff0c;它是由bentley推出的基于Cesium的开源图形框架&#xff0c;主要用于工程数字化BIM应…

<论文阅读>FLIRT:二维激光数据的兴趣区域及其在机器人导航中的应用

摘要&#xff1a;在这篇文章中&#xff0c;我们提出了FLIRT&#xff08;快速激光兴趣区域变换&#xff09;&#xff0c;用于 2D 激光数据的多尺度兴趣区域算子。FLIRT结合了基于大地线&#xff08;是指地球椭球面上两点间的最短程曲线&#xff09;的曲线近似范围信号的探测器和…

SpringMVC的作用,在Spring家族体系中功能角色?

一、 什么叫 MVC 模型-视图-控制器&#xff08;MVC&#xff09; 是一个众所周知的以设计界面应用程序为基础的设计思想。 它主要通过分离模型、 视图及控制器在应用程序中的角色将业务逻辑从界面中解耦。 通常&#xff0c; 模型负责封装应用程序数据在视图层展示。 视图仅仅只…

【蓝桥杯国赛真题08】python约分 蓝桥杯青少年组python编程 蓝桥杯国赛真题解析

目录 python约分 一、题目要求 1、编程实现 2、评分标准 二、解题思路 1、案例分析

C# mvc控制器向视图传递值

1.新建ASP.NET MVC应用程序&#xff0c;选择“空”模板&#xff0c;添加HomeController控制器和Index.cshtml视图页面。 2.选中Models文件夹&#xff0c;添加右键“添加—新建项”&#xff0c;弹出添加新项对话框&#xff0c;如图所示&#xff1a; 3.选择“数据”菜单&#xff…

(三)Redis的其他小功能

一 慢查询分析 所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间&#xff0c;当超过预设阈值&#xff0c;就将这条命令的相关信息&#xff08;例如&#xff1a;发生时间、耗时、命令的详细信息&#xff09;记录下来。 1.1 生命周期 发送命令-> 命令排队 ->…

vue 容超出三行之后显示下拉箭头 (可适配富文本)

问题提出&#xff1a;后台返回富文本&#xff0c;前端实现内容超出三行之后显示下拉箭头&#xff0c;展示全部&#xff0c;还可以收起 难点&#xff1a;富文本内容不稳定 会出现换行等 或者字体大小问题会印象 ps&#xff1a; 就算不是富文本只是正常的文章也是可以使用的呢 思…

嵌入式学习(3)ADC、DMA、通信方式

对寄存器的理解 寄存器&#xff0c;是连接软件跟硬件的桥梁&#xff0c;软件可对寄存器读写&#xff0c;而每个寄存器下面都连着一根导线&#xff0c;读写寄存器来改变状态&#xff0c;从而控制硬件 ADC&#xff08;Analog-Digital Converter&#xff09;模拟-数字转换器 ADC…

使用spire.pdf往某个位置处写文本信息

使用开发工具idea2022&#xff0c;java1.8版本&#xff0c;利用spire.pdf往一个现成的pdf中写入文本信息&#xff0c;经过一番研究&#xff0c;实现了&#xff0c;现在贴出代码分享&#xff1a; 首先导入Spire.Pdf.jar到maven汇总&#xff0c;因为我采用他的官网在pom中加依赖…