华为笔试题 – 多个数组按顺序合并(JAVA代码实现)
题目描述:
现在有多组整数数组,需要将他们合并成一个新的数组。合并规则,从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删除掉,如果该行不足固定长度或者已经为空,则直接取出剩余部分的内容放到新的数组中,继续下一行。如样例1,获得长度3,先遍历第一行,获得2,5,6;再遍历第二行,获得1,7,4;再循环回到第一行,获得7,9,5;再遍历第二行,获得3,4;再回到第一行,获得7,按顺序拼接成最终结果。
输入描述:
第一行是每次读取的固定长度,长度>0;
第2-n行是需要合并的数组,不同的数组用回车换行分隔,数组内部用逗号分隔。
输出描述
输出一个新的数组,用逗号分隔。
------------------------------------------示例-----------------------------------------
输入:
3
2
2,5,6,7,9,5,7
1,7,4,3,4
输出:
2,5,6,1,7,4,4,5,7,7,9,5,3,4,1,3,8,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
解法一:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
while(true){
break;
}
Scanner in = new Scanner(System.in);
int c = Integer.parseInt(in.nextLine());
int n = Integer.parseInt(in.nextLine());
int i = 0;
String[] str = new String[n];
while (i < n) {
str[i] = in.nextLine();
i++;
}
Integer[][] nums = new Integer[n][100];
Integer[] num = new Integer[n * 100];
Map<Integer, Integer> map = new HashMap();
Map<Integer, Integer> ml = new HashMap();
int m = 0;
for (int j = 0; j < n; j++) {
map.put(j, 0);
String[] cn = str[j].split(",");
ml.put(j, cn.length - 1);
for (int k = 0; k < cn.length; k++) {
nums[j][k] = Integer.parseInt(cn[k]);
}
}
int flag = 0;
while (true) {
for (int j = 0; j < n; j++) {
int s = 0;
if (ml.get(j) - map.get(j) + 1 >= c) {
for (int jj = 0; jj < c; jj++) {
num[m++] = nums[j][map.get(j)];
map.put(j, map.get(j) + 1);
}
s=1;
} else {
s=0;
s = ml.get(j) - (map.get(j) - 1);
for (int jj = 0; jj < s; jj++) {
num[m++] = nums[j][map.get(j)];
map.put(j, map.get(j) + 1);
}
}
if(s==0){
}else{
if (map.get(j) - 1 == ml.get(j)) {
flag++;
}
}
}
if(flag == n){
break;
}
}
for (int k = 0; k < m; k++) {
if (k != m - 1) {
System.out.print(num[k] + ",");
} else {
System.out.print(num[k]);
}
}
}
}
解法二:
import java.util.ArrayList;
import java.util.Scanner;
public class biShi {
public static boolean isNull(ArrayList<String> gh) {
int i = 0;
for (i = 0; i < gh.size(); i++) {
if (gh.get(i) != null)
break;
}
if (i < gh.size()) {
return false;
} else {
return true;
}
}
public static void Alg(ArrayList<String> ma, int num) {
String tem = "";// 作为最后的返回结果
while (!isNull(ma)) {
for (int i = 0; i < ma.size(); i++) {
String sk = ma.get(i);
if (sk == null) {
continue;
}
String[] gg = sk.split(",");
if (sk.length() == 0) {
ma.set(i, null);// 删掉取完的内容
} else {
if (gg.length <= num) {
tem = tem + sk + ",";
ma.set(i, null);
} else {
for (int k = 0; k < num; k++) {
tem = tem + gg[k] + ",";
}
String hh = "";
for (int l = num; l < gg.length; l++) {
if (l == gg.length - 1) {
hh = hh + gg[l];
} else {
hh = hh + gg[l] + ",";
}
}
// 将没取完的数组重新覆盖
ma.set(i, hh);
}
}
}
}
System.out.println(tem.substring(0, tem.length() - 1));
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
ArrayList<String> ma = new ArrayList<String>();
sc.nextLine();// nextInt()会留下一个回车,需要消除,否则后边会出错
while (!sc.hasNext("#")) {// 以#结束,这里你可以修改成其他的
ma.add(sc.nextLine());
}
Alg(ma, num);
}
}
解法三
/**
* @ClassName Main
* @Description TODO
* @Author ylqdh
* @Date 2020/4/7
*/
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
/*
随着输入增加,要拼接的数组会增多,那么拼接的结果就会变化
所以我定义了两个list,把所有的输入,存进一个list中; 然后另一个list每次只复制allList的值
如果只定义一个的话,会把前面的值清空
*/
List<String> allLine = new ArrayList<>(); // 随着输入增加,把所有的组以String存进list中
List<String> line = new ArrayList<>(); // 把目前的输入情况放到这个list中
scan.nextLine(); // 不知道为什么,如果不加这一行,后面的scan.nextLine()就读不到数据,有知道的可以告诉我一下
while (scan.hasNext()) {
// 把一行输入存储进All List中
allLine.add(scan.nextLine());
// 把当前的所有输入转到line中,随着后面的拼接,line里的内容会清空
for (int i = 0; i < allLine.size(); i++) {
line.add(allLine.get(i));
}
// 接下来就line里的所有数组进行拼接了;而所有结果都在all list中,不会造成影响
StringBuilder result = new StringBuilder();
String tmp;
int flag = 0;
int tmpSize = line.size();
while (flag < tmpSize) {
for (int j = 0; j < line.size(); j++) {
tmp = line.get(j);
// list的这个位置已经清空,不需要再进行拼接
if (tmp.length() == 0) {
flag++;
line.remove(j);
continue;
}
// 一行输入,需要以逗号分隔
String[] nums = tmp.split(",");
// 长度不足n位,则剩下的全部加到结果数组中
if (nums.length <= n) {
result.append(tmp).append(",");
line.set(j,"");
continue;
}
String sc = nums[0]+","+nums[1]+","+nums[2]+",";
result.append(sc); // 有3位,直接把这3位数字拼接到数组末尾
line.set(j,tmp.substring(sc.length())); // 原字符 则 减掉这3位
}
}
// 输出结果,注意要把末尾的逗号去掉
System.out.println(result.substring(0,result.length()-1));
}
}