#P3086. 数组拼接(100分)
          
                        
                                    
                      
        
              - 
          
          
                      2000ms
            
          
                      Tried: 141
            Accepted: 41
            Difficulty: 4
            
          
          
          
                       所属公司 : 
                              华为od
                                
            
                      
          
 
- 
                        算法标签>队列          
 
数组拼接(100分)
队列
首先,我们需要将每个字符串中的数字解析出来,并依次放入对应的队列中。 每个队列中的元素数量可能不同,因此需要找到所有队列中最大元素数量 mx,即元素最多的队列的大小。 每轮我们最多取出 m 个元素,因此总共需要取 (mx + m - 1) / m 轮,这样可以保证把所有队列中的元素全部取出。 取出之后用,拼接输出即可
代码如下
cpp
#include <bits/stdc++.h>
using namespace std;
#define N 100005
queue<int>q[10005];
int n;
int m;
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin>>m;
	cin>>n;
	int mx=0;
	for(int c=1;c<=n;c++){
		string s;
		cin>>s;
		for(int i=0;i<s.length();i++){
			int j=i;
			int res=s[j]-'0';
			int boo=1;
			while(s[j+1]>='0'&&s[j+1]<='9'&&j+1<=s.length()){
				j++;
				res=res*10+s[j]-'0';
			}
			i=j+1;
			q[c].push(res);
		}
		mx=max(mx,int(q[c].size()));
	}
	vector<int>ans;
	for(int i=1;i<=(mx+m-1)/m;i++){
		for(int j=1;j<=n;j++){
			int w=m;
			while(q[j].size()&&w--){
				ans.push_back(q[j].front());
				q[j].pop();
			}
		}
	}
	for(int i=0;i<ans.size();i++){
		if(i!=0) cout<<',';
		cout<<ans[i];
	}
	return 0;
}
python
from collections import deque
# 读取输入
m = int(input())
n = int(input())
# 初始化队列数组
q = [deque() for _ in range(n)]
mx = 0
# 处理输入字符串并存入队列
for c in range(n):
    s = input().split(',')  # 直接通过逗号拆分字符串,避免手动字符解析
    for num in s:
        q[c].append(int(num))  # 将每个数字放入相应的队列
    mx = max(mx, len(q[c]))  # 计算每个队列的最大长度
ans = []
# 将队列中的元素按照给定规则取出
for i in range((mx + m - 1) // m):  # 每次处理 m 个数字
    for j in range(n):
        w = m
        while q[j] and w > 0:
            ans.append(q[j].popleft())
            w -= 1
# 输出结果,按照逗号分隔
print(','.join(map(str, ans)))
java
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        sc.nextLine(); // 清除换行符
        Queue<Integer>[] q = new Queue[n + 1];
        for (int i = 1; i <= n; i++) {
            q[i] = new LinkedList<>();
        }
        int mx = 0;
        for (int c = 1; c <= n; c++) {
            String s = sc.nextLine();
            int i = 0;
            while (i < s.length()) {
                // 跳过非数字字符,比如逗号和空格
                if (s.charAt(i) == ',' || s.charAt(i) == ' ') {
                    i++;
                    continue;
                }
                int j = i;
                int res = 0;
                while (j < s.length() && Character.isDigit(s.charAt(j))) {
                    res = res * 10 + Character.getNumericValue(s.charAt(j));
                    j++;
                }
                i = j;
                q[c].add(res);
            }
            mx = Math.max(mx, q[c].size());
        }
        List<Integer> ans = new ArrayList<>();
        for (int i = 0; i < (mx + m - 1) / m; i++) {
            for (int j = 1; j <= n; j++) {
                int w = m;
                while (!q[j].isEmpty() && w-- > 0) {
                    ans.add(q[j].poll());
                }
            }
        }
        for (int i = 0; i < ans.size(); i++) {
            if (i > 0) {
                System.out.print(",");
            }
            System.out.print(ans.get(i));
        }
        sc.close();
    }
}
        题目描述
现在有多组整数数组,需要将它们合并成一个新的数组。
合并规则,从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删除掉,如果该行不足固定长度或者已经为空,则直接取出剩余部分的内容放到新的数组中,继续下一行。
输入描述
第一行是每次读取的固定长度,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