华为笔试题 – 多个数组按顺序合并(Java代码实现)
题目描述:
现在有多组整数数组,需要将他们合并成一个新的数组。合并规则,从每个数组里按顺序取出固定长度的内容合并到新的数组中,取完的内容会删除掉,如果该行不足固定长度或者已经为空,则直接取出剩余部分的内容放到新的数组中,继续下一行。如样例1,获得长度3,先遍历第一行,获得2,5,6;再遍历第二行,获得1,7,4;再循环回到第一行,获得7,9,5;再遍历第二行,获得3,4;再回到第一行,获得7,按顺序拼接成最终结果。
输入描述:
第一行是每次读取的固定长度,长度>0;
第2-n行是需要合并的数组,不同的数组用回车换行分隔,数组内部用逗号分隔。
输出描述:
输出一个新的数组,用逗号分隔。
-------------示例---------------------------------------------------------------------------
输入:
3
2,5,6,7,9,5,7
1,7,4,3,4
4,5,7,1,3,8
输出:
2,5,6,1,7,4,4,5,7,7,9,5,3,4,1,3,8,7
之前在这篇博客上
华为机考笔试题 – 数组按顺序合并(Java实现)
看到过有博主分享答案,但是试着运行了一下答案是错的,就自己试着编了一下,下面是我写的代码,亲测可以通过(这个代码还可以进一步优化,优化版本的后续再更新~~)欢迎评论留言,大家共同进步!
package Shuru_lianxi;
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);
}
}
下面是我在Eclipse中运行的结果(附图一张)
最后,说明一点: 上面的这个解决方案的时间复杂度还是有待改进的,应该不是很优的,还有待改进和优化,后续继续改进!
欢迎同道小伙伴留言交流!
共同进步!
共同进步!
共同进步!