22.华为OD机试真题:数组拼接(Java实现,100分通关)

目录

  1. 题目描述
  2. 输入输出描述
  3. 用例演示
  4. 解题思路
  5. [Java 代码实现](#Java 代码实现)
  6. 代码解释
  7. 总结

题目描述

现有多组整数数组,需要将它们合并成一个新的数组。合并规则:从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删除掉;如果该数组不足固定长度或已经为空,则直接取出剩余部分的内容放到新的数组中,继续处理下一个数组。

输入输出描述

输入描述

  1. 第一行:每次读取的固定长度,满足 长度
  2. 第二行:整数数组的数目,满足 数目
  3. 第 3~n 行:需要合并的数组,不同数组用回车换行分隔,数组内部用逗号分隔,每个数组最大不超过 100 个元素。

输出描述

输出合并后的新数组,元素之间用逗号分隔。

用例演示

用例 1

输入

java 复制代码
3
2
2,5,6,7,9,5,7
1,7,4,3,4

输出

java 复制代码
2,5,6,1,7,4,7,9,5,3,4,7

用例 2

输入

java 复制代码
4
3
1,2,3,4,5,6
1,2,3
1,2,3,4

输出

java 复制代码
1,2,3,4,1,2,3,1,2,3,4,5,6

解题思路

  1. 数据存储 :将输入的多个数组转换为List<List<Integer>>结构,便于动态删除已取出的元素。
  2. 循环取数:持续遍历所有数组,每次从当前数组取出固定长度的元素(不足则取剩余),添加到结果集,并删除原数组中已取出的元素。
  3. 终止条件:当所有数组都为空时,停止循环,将结果集按格式输出。

Java 代码实现

java 复制代码
import java.util.*;

public class ArrayMerge {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取固定长度
        int k = Integer.parseInt(scanner.nextLine().trim());
        // 读取数组数目
        int n = Integer.parseInt(scanner.nextLine().trim());
        
        // 存储所有数组(动态列表,便于删除元素)
        List<List<Integer>> arrays = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            String line = scanner.nextLine().trim();
            String[] elements = line.split(",");
            List<Integer> arr = new ArrayList<>();
            for (String e : elements) {
                arr.add(Integer.parseInt(e));
            }
            arrays.add(arr);
        }
        
        // 存储最终结果
        List<Integer> result = new ArrayList<>();
        
        // 循环取数,直到所有数组为空
        boolean hasElement = true;
        while (hasElement) {
            hasElement = false;
            for (List<Integer> arr : arrays) {
                if (!arr.isEmpty()) {
                    hasElement = true;
                    // 取前k个元素(不足则取全部)
                    int take = Math.min(k, arr.size());
                    List<Integer> sub = arr.subList(0, take);
                    result.addAll(sub);
                    // 删除已取出的元素
                    sub.clear();
                }
            }
        }
        
        // 输出结果(逗号分隔)
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < result.size(); i++) {
            sb.append(result.get(i));
            if (i != result.size() - 1) {
                sb.append(",");
            }
        }
        System.out.println(sb.toString());
        
        scanner.close();
    }
}

代码解释

  1. 输入处理 :通过Scanner逐行读取固定长度k、数组数目n,并将每个数组解析为List<Integer>存入二维列表。
  2. 核心循环 :通过while循环持续遍历数组,Math.min(k, arr.size())确定每次取数的长度,subList(0, take)获取子列表并添加到结果集,sub.clear()删除原数组中已取出的元素。
  3. 结果输出 :通过StringBuilder拼接结果集元素,按逗号分隔后打印。

总结

本题的核心是动态操作数组元素循环遍历取数 ,使用List的动态特性可以高效实现 "取数并删除" 的

相关推荐
JavaGuru_LiuYu21 小时前
Spring Boot 整合 SSE(Server-Sent Events)
java·spring boot·后端·sse
2501_9418752821 小时前
在东京复杂分布式系统中构建统一可观测性平台的工程设计实践与演进经验总结
c++·算法·github
爬山算法21 小时前
Hibernate(26)什么是Hibernate的透明持久化?
java·后端·hibernate
sonadorje21 小时前
梯度下降法的迭代步骤
算法·机器学习
彭于晏Yan21 小时前
Springboot实现数据脱敏
java·spring boot·后端
漫随流水21 小时前
leetcode算法(94.二叉树的中序遍历)
数据结构·算法·leetcode·二叉树
luming-021 天前
java报错解决:sun.net.utils不存
java·经验分享·bug·.net·intellij-idea
北海有初拥1 天前
Python基础语法万字详解
java·开发语言·python
alonewolf_991 天前
Spring IOC容器扩展点全景:深入探索与实践演练
java·后端·spring