我有一个项目要求我合并两个已排序的数组(a 和 b)并将结果放入长度为 a.length + b.length 的新数组中。 我正在跟踪我在所有 3 个数组中的位置计数器,并且我的数组长度不相等。我的约定是,如果一个数组先于另一个数组用完,代码只会将另一个数组的其余部分转储到结果数组中。
不幸的是,我可以检查另一个数组是否仍然包含元素的唯一方法是查看 for 循环。
谁能帮帮我?这应该是一个相对容易的修复,但我想不出解决方案。
public class Two {
public static void main(String[] args) {
//sample problem
int[] var_a = {2,3,5,5,8,10,11,17,18,20};
int[] var_b = {5,6,7,8,14,15,17};
final int a_size = 10;
final int b_size = 7;
final int c_size = 17;
int[] var_c = new int[17];
int aCount = 0;
int bCount = 0;
int cCount = 0;
for (cCount = 0; cCount < c_size; cCount++) {
//b runs out before a runs out
if ((bCount == b_size) && (aCount <= a_size)) {
//dump rest of var_a into var_c
var_c[cCount] = var_a[aCount];
aCount++;
}
//PROBLEM: bCount is equal to bSize, and is triggering the break.
//a runs out before b runs out
else if ((aCount == a_size) && (bCount <= b_size)) {
//dump rest of var_b into var_c
var_c[cCount] = var_b[bCount];
bCount++;
}
if ((aCount >= a_size) || (bCount >= b_size) || (cCount >= c_size)) {break;}
if (var_a[aCount] < var_b[bCount]) {
var_c[cCount] = var_a[aCount];
aCount++;
} else if (var_a[aCount] > var_b[bCount]) {
var_c[cCount] = var_b[bCount];
bCount++;
} else if (var_a[aCount] == var_b[bCount]) {
var_c[cCount] = var_a[aCount];
aCount++;
cCount++;
var_c[cCount] = var_b[bCount];
bCount++;
}
}
for (int i : var_c) {
System.out.print(i + " ");
}
}
}
最佳答案
这个问题的一个常见解决方案是用三个循环替换单个循环:
- 第一个循环合并两个数组,直到其中一个用完元素
- 第二个循环将数组
A
的剩余元素(如果有)转储到输出数组中 - 第三个循环将数组
B
的剩余元素(如果有)转储到输出数组中
这个结构可以让合并循环变得更简单:
while (aCount != var_a.length() && b.Count != var_b.length()) {
... // merge
}
while (aCount != var_a.length()) {
var_c[cCount++] = var_a[aCount++];
}
while (bCount != var_b.length()) {
var_c[cCount++] = var_b[bCount++];
}
请注意,在最后两个循环中,最多会执行一个。还要注意使用 length()
方法来确定数组的长度。它比设置a_size
、b_size
等更可靠。
关于java - 合并不等长的排序数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33542970/