我有一个项目要求我合并两个排序的数组(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 + " ");
}
}
}
答案 0 :(得分:2)
这个问题的一个常见解决方案是用三个替换单个循环:
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
等更可靠。
答案 1 :(得分:2)
此代码应遵循
的简单逻辑答案 2 :(得分:1)
不是迭代合并数组的索引,而是迭代各个数组的索引,以确保永远不会超出范围:
int aCount = 0;
int bCount = 0;
int cCount = 0;
while (aCount < var_a.length && bCount < var_b.length) {
if (var_a[aCount] <= var_b[bCount]) {
var_c[cCount++] = var_a[aCount++];
} else {
var_c[cCount++] = var_b[bCount++];
}
}
// now add what remains of var_a or var_b
while (aCount < var_a.length)
var_c[cCount++] = var_a[aCount++];
while (bCount < var_b.length)
var_c[cCount++] = var_b[bCount++];
答案 3 :(得分:1)
这可能是你想要的:
void doArrayThing(){
//the two arrays containing the elements
int[] array1 = {1, 3, 5, 2, 7, 5};
int[] array2 = {3, 6, 2, 8};
//the length of the 2 arrays
int arrayLength1 = array1.length;
int arrayLength2 = array2.length;
//the length of both the arrays
int containerArrayLength = arrayLength1 + arrayLength2;
//the array that holds all the elements
int[] container = new int[containerArrayLength];
//a for loop that adds the first array elements
for(int i = 0; i < arrayLength1; i++){
//add the elements of the first array
container[i] = array1[i];
}
//the for loop that adds the second array elements
for(int i = 0; i < arrayLength2; i++){
//add the second array elements on top of the first
container[i + arrayLength1] = array2[i];
}
for(int i = 0; i < containerArrayLength; i++){
//print all the elements
System.out.println(container[i]);
}
}
它的作用:
迭代第一个数组并添加数字,然后遍历第二个数组并在第一个数组元素的顶部添加元素。
答案 4 :(得分:1)
您的算法看起来基本正确。如果没有完全按照确切的代码运行,我认为你的问题主要是你有太多的平等,即几乎你所拥有的每一个比较都是等于,等等,等等。等等。
如果a == b,那么a&lt; = b和a&gt; = b。因为这个,你的if语句太多了。密切关注具体指标应该是什么,并将您的案例限制在它们应该是什么样的位置。
我已经重写了你的代码(没有编辑器,抱歉,所以它可能无法开箱即用),这应该会给你一个很好的主意。
$("#datepicker").datepicker("option", { buttonText: "test" });