当前位置: 首页 > article >正文

华为OD E卷(100分)38-数组拼接

前言

        工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老, 没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练手。希望通过这些分享能够帮到一些人,也希望能和看到此文的大神们沟通交流,提升自己,更希望在此期间能够找到一份理想的工作。

题目描述

        现在有多组整数数组,需要将它们合并成一个新的数组。合并规则如下:

  1. 从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删除掉。
  2. 如果该行不足固定长度或者已经为空,则直接取出剩余部分的内容放到新的数组中,继续下一行。

输入

  1. 第一行是每次读取的固定长度L,满足 0<L<10。
  2. 第二行是整数数组的数目N,满足 0<N<1000。
  3. 第 3 到第 N+2 行是需要合并的数组,不同的数组用回车换行分隔,数组内部用逗号分隔,每个数组最多不超过 100 个元素。

输出

        输出一个新的数组,用逗号分隔。

示例 

示例1

输入
3
2
2,5,6,7,9,5,7
1,7,4,3,4
输出

2,5,6,1,7,4,7,9,5,3,4,7

说明

1、获得长度3和数组数目2
2、先遍历第一行,获得2,5,6
3、再遍历第二行,获得1,7,4
4、再循环回到第一行,获得7,9,5
5、再遍历第二行,获得3,4
6、再回到第一行,获得7,按顺序拼接成最终结果

示例2

输入
4
3
1,2,3,4,5,6
1,2,3
1,2,3,4
输出

1,2,3,4,1,2,3,1,2,3,4,5,6

说明

种第7棵树,最多连续胡杨树棵数位6(5,6,7,8,9,10)

示例3

输入
3
2
2,5,6,7,,,9,5,7
1,7,4,3,,4
输出

2,5,6,1,7,4,7,9,5,3,4,7

说明

输入用例中的数组存在空元素,需要过滤掉空串

数据范围

0<L<10
0<N<1000
每个数组最多不超过 100 个元素 

解题思路

        使用List存储,每个对象为String数组,且为去除为空的。

        循环遍历每个数组并取L长度的值,直到结尾为止。读完的从List中去除,直到List为空为止。

题解

Java实现

package huawei.e100;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;

/**
* @author YangShun
* @date 2024年12月24日
* 数组拼接
*/
public class T38 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while(sc.hasNext()) {
			int l = sc.nextInt();
			int n = sc.nextInt();
			sc.nextLine();
			List<String[]> data = new ArrayList<>();
			for (int i = 0; i < n; i++) {
				String[] tmp = sc.nextLine().split(",");
				// 数组去除空数据 并添加到列表中
				data.add(Arrays.stream(tmp).filter(str-> str.trim().length()>0).toArray(String[]::new));
			}
			List<String> res = run(data, l);
			System.out.println(String.join(",", res));
		}
	}
	
	
	static List<String> run(List<String[]> data, int l) {
		List<String> res = new ArrayList<>();
		int time = 0;
		// 循环取值,直到列表为空为止
		while(data.size()> 0) {
			Iterator<String[]> it = data.iterator();
			while(it.hasNext()) {
				String[] d = it.next();
				if(l*time >= d.length) {
					it.remove(); // 取完的数组从列表中删除
				} else {
					// 每次从数组中取l个数,遇到结束退出
					for (int i = l*time; i < d.length && i < l*time + l; i++) {
						res.add(d[i]);
					}
				}
			}
			
			time ++;
		}
		return res;
	}

}


http://www.kler.cn/a/454452.html

相关文章:

  • 基于Android实现的2048小游戏
  • Effective C++ 条款 12:复制对象时勿忘其每一个成分
  • .NET 8.0 项目升级到 .NET 9.0
  • 利用Java爬虫速卖通按关键字搜索AliExpress商品
  • 流量主微信小程序工具类去水印
  • 基于大涡模拟与中尺度数值天气模式的精细化风场模拟
  • 云渲染,Enscape、D5、Lumion渲染提速教程
  • Cadence学习笔记 11 PCB中器件放置
  • 嵌入式学习-QT-Day03
  • VB.NET在 Excel 二次开发中的全面应用
  • NLP 中文拼写检测开源-03-hunspell 拼写纠正算法入门介绍 CSC
  • python实现根据搜索关键词爬取某宝商品信息
  • tcp 的重传,流量控制,拥塞控制
  • MySQL:顿悟‌了,添加索引时竟然不锁表?
  • 【Java 数据结构 】反转一个单链表
  • Visual Studio2019基础使用指南
  • 每天40分玩转Django:实操多语言博客
  • Day53 图论part04
  • Stable Diffusion绘画 | 电商设计海报
  • hhdb客户端介绍(57)