我的代码应该选择三个数组并返回三个数组的组合,这些数组可以具有不同的长度。该代码应在O(n)中进行组合。
示例:a [] = {1,2} b [] = {1,4,5} c [] = {2,4,5,6}
我的结果应该是:d [] = {1,1,2,2,4,4,5,5,6}
答案 0 :(得分:2)
[在问题编辑中添加O(n)约束之前已回答。]
将所有数组添加到列表并再次排序。一个例子是:
Integer[] a = {1, 2};
Integer[] b = {1, 4, 5};
Integer[] c = {2, 4, 5, 6};
List<Integer> lists = new ArrayList<>();
lists.addAll(Arrays.asList(a));
lists.addAll(Arrays.asList(b));
lists.addAll(Arrays.asList(c));
//print
lists
.stream()
.sorted()
.forEach(System.out::println);
答案 1 :(得分:2)
一种方法(我相信还有很多其他方法)将是:
根据输入数组长度的总和创建输出数组:
int[] output = new int[a.length + b.length + c.length];
为每个输入数组创建一个索引指针:
int aIndex = 0;
int bIndex = 0;
int cIndex = 0;
对输出数组中的每个位置循环一次,并用每个输入数组的当前索引处的最小值填充它(检查是否没有用完该数组):
for(int outputIndex = 0; outputIndex < output.length; outputIndex++) {
if (aIndex < a.length
&& (bIndex >= b.length || a[aIndex] <= b[bIndex])
&& (cIndex >= c.length || a[aIndex] <= c[cIndex])) {
output[outputIndex] = a[aIndex];
aIndex++;
} else if (bIndex < b.length
&& (aIndex >= a.length || b[bIndex] <= a[aIndex])
&& (cIndex >= c.length || b[bIndex] <= c[cIndex])) {
output[outputIndex] = b[bIndex];
bIndex++;
} else {
output[outputIndex] = c[cIndex];
cIndex++;
}
}
编辑:这是我经过编译和测试的代码:
public class Join {
public static void main(String[] args) {
int[] a = {1, 2};
int[] b = {1, 4, 5};
int[] c = {2, 4, 5, 6};
int[] output = new int[a.length + b.length + c.length];
int aIndex = 0;
int bIndex = 0;
int cIndex = 0;
for(int outputIndex = 0; outputIndex < output.length; outputIndex++) {
if (aIndex < a.length
&& (bIndex >= b.length || a[aIndex] <= b[bIndex])
&& (cIndex >= c.length || a[aIndex] <= c[cIndex])) {
output[outputIndex] = a[aIndex];
aIndex++;
} else if (bIndex < b.length
&& (aIndex >= a.length || b[bIndex] <= a[aIndex])
&& (cIndex >= c.length || b[bIndex] <= c[cIndex])) {
output[outputIndex] = b[bIndex];
bIndex++;
} else {
output[outputIndex] = c[cIndex];
cIndex++;
}
}
}
}
在调试器中通过方法末尾的断点验证。