华为机试:数组合并

题目描述

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

输入描述

第一 行每次读取的固定长度
长度0<len<10
第二行是整数数组的数目
数目 0<num<10000
第3~n行是需要合并的数组
不同的数组用换行分割
元素之间用逗号分割
最大不超过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

说明:

获得长度3和数组数目2
先遍历第一行 获得2,5,6
再遍历第二行 获得1,7,4
再循环回到第一行获得7,9,5
再遍历第二行获得3,4
再回到第一行获得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

思路分析

  • 数组合并,长度可变,Java中可以使用List进行处理。

参考代码

注:题目网上找的,参考代码是练习用,仅供参考,并不保证用例通过率。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

/**
 * 数组合并
 */
public class Test0022 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int len = scanner.nextInt(); // 行每次读取的固定长度
        int num = scanner.nextInt(); // 整数数组的数目
        String s = scanner.nextLine(); // nextInt后有空行,先读取一次

        List<List<String>> arrays = new ArrayList<>(num);
        int maxArrayLen = 0;
        int totalLen = 0;
        for (int i = 0; i < num; i++) {
            List<String> array = Arrays.stream(scanner.nextLine().split(",")).collect(Collectors.toList());
            arrays.add(array);
            totalLen += array.size();
            maxArrayLen = Math.max(maxArrayLen, array.size());
        }


        // 计算每个数组最多需要截取几次,即遍历次数
        int cycle;
        if (maxArrayLen % len == 0) {
            cycle = maxArrayLen / len;
        } else {
            cycle = maxArrayLen / len + 1;
        }

        // 拼接结果数组
        List<String> results = new ArrayList<>(totalLen);

        int start;
        int end;
        for (int i = 0; i < cycle; i++) {
            for (List<String> array : arrays) {
                start = i * len;
                end = (i + 1) * len;
                int size = array.size();

                // 如果开始index已经大于数组最大,说明该数组取完了
                if (start > size - 1) {
                    continue;
                }

                // 结束index最大为size
                if (end > size) {
                    end = size;
                }

                // 取指定长度的子数组
                results.addAll(array.subList(start, end));
            }
        }
        System.out.println(String.join(",", results));
    }
}

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值