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的动态特性可以高效实现 "取数并删除" 的

相关推荐
NAGNIP3 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
程序员清风9 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林55110 小时前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
颜酱11 小时前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub15 小时前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub15 小时前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub15 小时前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub15 小时前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub15 小时前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉
华仔啊16 小时前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端