E-数组拼接(100p)

刷题笔记合集🔗

数组拼接

问题描述

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

输入格式

第一行是每次读取的固定长度 ,满足

第二行是整数数组的数目 ,满足

到第 行是需要合并的数组,不同的数组用回车换行分隔,数组内部用逗号分隔,每个数组最多不超过 个元素。

输出格式

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

样例输入1

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

样例输出1

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

样例输出2

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

样例输入3

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

样例输出3

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

样例解释

样例 解释说明
样例1 1、获得长度3和数组数目2
2、先遍历第一行,获得2,5,6
3、再遍历第二行,获得1,7,4
4、再循环回到第一行,获得7,9,5
5、再遍历第二行,获得3,4
6、再回到第一行,获得7,按顺序拼接成最终结果
样例2
样例3 输入用例中的数组存在空元素,需要过滤掉空串

数据范围

  • 每个数组最多不超过 个元素

题解

这道题目的核心是要理解如何按照给定的规则合并多个数组。我们可以用一个简单的循环来实现这个过程。

首先,我们需要读取固定长度 和数组数目 。然后,我们可以使用一个列表来存储所有的输入数组。

合并过程可以这样进行:

  1. 创建一个空的结果列表。
  2. 循环遍历所有输入数组,每次从当前数组取出 个元素(或者如果数组长度不足 ,就取出所有剩余元素)。
  3. 将取出的元素添加到结果列表中。
  4. 如果当前数组还有剩余元素,就将其放回数组列表的末尾。
  5. 重复步骤2-4,直到所有数组都被处理完毕。

这个算法的时间复杂度是 ,其中 是所有数组中元素的总数。因为我们只需要遍历每个元素一次。

空间复杂度也是 ,因为我们需要存储所有的输入元素和输出结果。

对于给定的数据范围(,每个数组最多100个元素),这个算法是完全可以接受的。即使在最坏情况下(1000个数组,每个数组100个元素),总元素数也只有100000,现代计算机可以在很短的时间内处理这么多元素。

需要注意的是,输入可能包含空元素,我们需要在读取输入时过滤掉这些空元素。这可以通过使用filter函数或列表推导式来实现。

参考代码

  • Python
# 读取固定长度L
L = int(input())
# 读取数组数目N
N = int(input())

# 读取并处理输入数组,过滤掉空元素
arrays = [list(filter(lambda x: x != "", input().split(","))) for _ in range(N)]

# 初始化结果列表
result = []

# 当还有数组未处理完时,继续循环
while arrays:
    # 取出第一个数组
    current_array = arrays.pop(0)
    
    # 如果当前数组长度大于等于L,取前L个元素
    if len(current_array) >= L:
        result.extend(current_array[:L])
        # 如果数组还有剩余元素,将剩余部分放回数组列表末尾
        if len(current_array) > L:
            arrays.append(current_array[L:])
    else:
        # 如果当前数组长度小于L,取所有元素
        result.extend(current_array)

# 将结果转换为字符串并打印
print(",".join(result))
  • C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_ARRAYS 1000
#define MAX_ELEMENTS 100

// 函数用于分割字符串
int split(char* str, char* delim, char** result) {
    int count = 0;
    char* token = strtok(str, delim);
    while (token != NULL) {
        if (strlen(token) > 0) {
            result[count++] = token;
        }
        token = strtok(NULL, delim);
    }
    return count;
}

int main() {
    int L, N;
    char line[1000];
    char* arrays[MAX_ARRAYS][MAX_ELEMENTS];
    int array_lengths[MAX_ARRAYS] = {0};
    char* result[MAX_ARRAYS * MAX_ELEMENTS];
    int result_count = 0;

    // 读取固定长度L
    scanf("%d", &L);
    // 读取数组数目N
    scanf("%d", &N);
    getchar(); // 消耗换行符

    // 读取并处理输入数组
    for (int i = 0; i < N; i++) {
        fgets(line, sizeof(line), stdin);
        line[strcspn(line, "\n")] = 0; // 移除换行符
        array_lengths[i] = split(line, ",", arrays[i]);
    }

    int current_array = 0;
    while (1) {
        int elements_to_take = L;
        if (array_lengths[current_array] < L) {
            elements_to_take = array_lengths[current_array];
        }

        // 取出元素并添加到结果中
        for (int i = 0; i < elements_to_take; i++) {
            result[result_count++] = arrays[current_array][i];
        }

        // 更新数组
        for (int i = elements_to_take; i < array_lengths[current_array]; i++) {
            arrays[current_array][i - elements_to_take] = arrays[current

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

11-17 20:52
南昌大学 C++
1.530.二叉搜索树的最小绝对差:依然是利用二叉搜索树中序遍历得到的结点是有序的特性,对其进行递归中序遍历,并采用双指针法得到两个结点间的绝对差(中序遍历得到的有序数组中相邻两个结点间的绝对差一定是最小的,不需要再去与更远的结点进行比较,只需要比较两两相邻间的差值就够了),最后通过对绝对差进行不断更新就能获得最小绝对差。2.501.二叉搜索树中的众数: 递归中序遍历,双指针比较前后两个结点是否相等,同时更新maxValue,当count==maxValue时,将该元素加入到结果集中。如果count>maxValue,要注意更新maxValue的值,并清空结果集(失效)。注意递归过程中这些值都要是全局变量。3.236.二叉树的最近公共祖先:递归后序遍历,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//左右子树都不为空,说明找到了pq,此时root就是最近公共祖先&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(left&nbsp;!=&nbsp;NULL&nbsp;&amp;&amp;&nbsp;right&nbsp;!=&nbsp;NULL)&nbsp;return&nbsp;root;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当一边找了了p/q,就直接返回这边的结点,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当层层递归结束,要么会只返回这个结点(这个结点本身就是最近公共祖先)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//要么会与另外一支汇合,分别作为左右结点返回值,最后返回他们此时的根节点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(left&nbsp;!=&nbsp;NULL&nbsp;&amp;&amp;&nbsp;right&nbsp;==&nbsp;NULL)&nbsp;return&nbsp;left;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if(left&nbsp;==&nbsp;NULL&nbsp;&amp;&amp;&nbsp;right&nbsp;!=&nbsp;NULL)&nbsp;return&nbsp;right;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;return&nbsp;NULL;这两天被文本查询卡住了,有点烦躁,把权游八季的解说看完了,现在心静下来了,后面继续刷算法,搞完这个文本查询就开始学STL了。不要放弃!
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务