给定两个排序的整数数组A和B,将B合并为A作为一个排序数组。
注意:您必须修改数组A以包含A和B的合并。 不要在代码中输出任何内容。提示:C用户,请malloc了 结果进入一个新数组并返回结果。
如果A和B中初始化的元素数分别为m和n,则执行代码后数组A的结果大小应为m + n
示例:
Input :
A : [1 5 8]
B : [6 9]
Modified A : [1 5 6 8 9]
我的解决方案:
public class Solution {
public void merge(ArrayList<Integer> a, ArrayList<Integer> b) {
int i=0,j=0;
ArrayList<Integer> al= new ArrayList<Integer>();
while(i<a.size() && j<b.size()){
if(a.get(i)<b.get(j)){
al.add(a.get(i));
i++;
}
else{
al.add(b.get(j));
j++;
}
}
while(i<a.size()){
al.add(a.get(i));
i++;
}
while(j<b.size()){
al.add(b.get(j));
j++;
}
}
我创建了第3个ArrayList,我合并了第一个和第二个ArrayLists的所有元素。现在我必须将3rd ArrayList的所有元素复制到第一个。 我现在被困住了。因为,当我使用
调整大小时public static void ensureSize(ArrayList<Integer> list, int size){
list.ensureCapacity(size);
while(list.size()<size){
list.add(null);
}
}
ensureSize(a,al.size());
for(int k=0;k<al.size();k++){
a.set(k,al.get(k));
}
它给了我ArrayIndexOutOfBound错误。我试过了Collections.copy(a,al)
,它也没有用。
答案 0 :(得分:5)
由于两个给定的数组已经排序
输入:A:[1 5 8] B:[6 9]
修改A:[1 5 6 8 9]
你可以这样做:选项:1
public static int[] merge(int[] a, int[] b) {
int[] answer = new int[a.length + b.length];
int i = 0, j = 0, k = 0;
while (i < a.length && j < b.length)
{
if (a[i] < b[j])
answer[k++] = a[i++];
else
answer[k++] = b[j++];
}
while (i < a.length)
answer[k++] = a[i++];
while (j < b.length)
answer[k++] = b[j++];
return answer;
}
注意:我使用的是数组而不是ArrayList,因为我认为这就是问题所要求的。此外,了解concept of merging sorted arrays非常有帮助,此链接也会有所帮助。
另一种选择,如果你想真正时髦:选项:2
public static int[] merge(int[] a, int[] b) {
int[] answer = new int[a.length + b.length]
int i = a.length - 1, j = b.length - 1, k = answer.length;
while (k > 0)
answer[--k] =
(j < 0 || (i >= 0 && a[i] >= b[j])) ? a[i--] : b[j--];
}
但如果你真的想使用Lists
那么我会做这样的事情:选项:3
public static <T> ArrayList<T> merge(List<T> a, List<T> b) {
ArrayList<T> result = new ArrayList<T>();
int size = Math.max(a.size(), b.size());
for (int i = 0; i < size; i++) {
if (i < a.size()) result.add(a.get(i));
if (i < b.size()) result.add(b.get(i));
}
return result;
}
如果列表确实是唯一的选项,我可能甚至不会使用我自己的算法,你可以简单地使用内置函数,例如:选项:4
List<Integer> all = new ArrayList<Integer>();
all.addAll(list1);
all.addAll(list2);
Collections.sort(all);
这最后一个算法适用于最初不按排序顺序排列的数组,我认为你不是在寻找它,但它是一个选项。
如何执行选项:3 :
public static void main(String[] args){
List<Integer> l1 = Arrays.asList(1,5,7,9);
List<Integer> l2 = Arrays.asList(4,3,11);
System.out.println(merge(l1,l2));
}
根据我收集的内容,您还希望将新ArrayList
与第一个ArrayList
合并,并删除所有重复内容,我会这样做:
for (Object x : two){
if (!one.contains(x))
one.add(x);
}
答案 1 :(得分:0)
要完成答案,请在返回答案之前将以下代码添加到上述解决方案中;
a = new int[answer.length];
a = Arrays.copyOf(answer, answer.length);
并更改
return answer;
到
return a;
答案 2 :(得分:0)
我相信使用以下内容可以更简单地解决这个问题。
实施例
[X,T] = simpleseries_dataset;
Y=mat2cell(cellfun(@(x) x*2,X),1,ones(1,100))
net = narxnet(1:2,1:3); %classic narxnet
net.numInputs = 3; % adding an input
net.inputConnect =[1 1 1; 0 0 0]; %connecting 3 inputs to the first layer
%defining input 3
net.inputs{3}.name = 'Input3';
net.inputs{3}.processFcns = {'mapminmax'}; %whaterever you want, but remember to set them
net.inputWeights{1,3}.delays= 1:4; % the actual delay value for an input
view(net) %
%prepare and close
[Xs,Xi,Ai,Ts] = preparets(net,[X;Y],{},T); %train with exogene inputs
net = train(net,Xs,Ts,Xi,Ai);
net = closeloop(net);
view(net) %please note that the order of inputs is switched in the picture
%prepare and use
[Xs,Xi,Ai,Ts] = preparets(net,[X;Y],{},T);
T2 = net(Xs,Xi,Ai);
%if you want to see the results
plot(cell2mat(T(5:96)))
hold on
plot(cell2mat(T2))