sbk*_*sbk -4 java arrays collections arraylist
给定两个排序的整数数组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]
Run Code Online (Sandbox Code Playgroud)
我的解决方案
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++;
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了第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));
}
Run Code Online (Sandbox Code Playgroud)
它给了我ArrayIndexOutOfBound错误.我试过Collections.copy(a,al),它也没用.
由于两个给定的数组已经排序
输入: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;
}
Run Code Online (Sandbox Code Playgroud)
注意:我已经使用了数组而不是ArrayList,因为我认为这就是问题所要求的.理解合并排序数组的概念也很有帮助,这个链接会有所帮助.
另一种选择,如果你想变得时髦:选项: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--];
}
Run Code Online (Sandbox Code Playgroud)
但如果你真的想使用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;
}
Run Code Online (Sandbox Code Playgroud)
如果列表确实是唯一的选项,我可能甚至不会使用我自己的算法,你可以简单地使用内置函数,例如:选项:4
List<Integer> all = new ArrayList<Integer>();
all.addAll(list1);
all.addAll(list2);
Collections.sort(all);
Run Code Online (Sandbox Code Playgroud)
最后一个算法适用于最初不按排序顺序排列的数组,我不认为你在寻找它,但它是一个选项.
如何执行选项: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));
}
Run Code Online (Sandbox Code Playgroud)
从我收集到的你也想要将new ArrayList与第一个合并ArrayList并删除任何重复项,我会做这样的事情:
for (Object x : two){
if (!one.contains(x))
one.add(x);
}
Run Code Online (Sandbox Code Playgroud)
这已经回答了这个帖子,看看
| 归档时间: |
|
| 查看次数: |
984 次 |
| 最近记录: |