#P3086. 数组拼接(100分)
-
2000ms
Tried: 142
Accepted: 42
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