数组拼接

题目描述

现在有多组整数数组, 需要将它们合并成一个新的数组.

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

输入描述

  • 第一行是每次读取的固定长度, 0<长度<10
  • 第二行是整数数组的数目, 0<数目<1000
  • 第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

说明:

  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

题解

Python

import sys

def main():
    # 解析目标数组的长度 k
    k = int(input())
    num_arrays = int(input())
    # 解析所有的数组
    all_arrays = []
    for line in sys.stdin.readlines():
        all_arrays.append(list(map(int, line.split(","))))
    #print("all_arrays:", all_arrays)
    assert len(all_arrays) == num_arrays

    # 依次遍历所有数组, 取出 k 个元素
    # 如果不足k 个元素, 就取出剩下的所有元素, 然后与下面一个数组拼够 k 个元素
    # 直到所有数组里的元素都被取出
    i = 0
    ans = []
    nums_taken = k
    while True:
        current_array = all_arrays[i]
        if len(current_array) > nums_taken:
            # 取出足够的元素
            ans.extend(current_array[:nums_taken])
            all_arrays[i] = current_array[nums_taken:]
            # 去下一个数组
            i = (i + 1) % len(all_arrays)
            nums_taken = k
        else:
            # 还有几个元素等下一轮获取
            nums_taken -= len(current_array)
            # 取出所有元素
            ans.extend(current_array[:])
            # 将当前数组移除
            all_arrays.pop(i)
            if all_arrays:
                i = i % len(all_arrays)
            else:
                break

    for num in ans[:-1]:
        print(num, ",", sep="", end="")
    if ans:
        print(ans[-1])

if __name__ == "__main__":
    main()