消除重复JAVA数组的最佳实现
找到此解决方案以使此方法:消除重复JAVA数组的最佳实现,java,arrays,algorithm,sorting,Java,Arrays,Algorithm,Sorting,找到此解决方案以使此方法: int[] withoutDuplicates(int[] a){ int n = a.length; if (n < 2) { return a; } for (int i = 0; i < n-1; i++) { for (int j = i+1; j < n; j++) { if (a[j] == a[i]) { --n;
int[] withoutDuplicates(int[] a){
int n = a.length;
if (n < 2) {
return a;
}
for (int i = 0; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
if (a[j] == a[i]) {
--n;
System.arraycopy(a, j+1, a, j, n-j);
--j;
}//end if
} //end for
}//end for
int[] aa = new int[n];
System.arraycopy(a, 0, aa, 0, n);
return aa;
}//end method
int[]无重复项(int[]a){
int n=a.长度;
if(n<2){
返回a;
}
对于(inti=0;i
我不明白它为什么使用长度为n的数组。它的大小不应该是n减去删除的重复数吗?
这是实现该方法的最佳方式吗?或者我可以使用任何java资源吗?我天生懒惰。我会这样做: --编辑--
private int[]不带重复项(int[]a){
Set Set=newlinkedhashset();
for(int x:a){
增加(x);
}
int[]newArray=newint[set.size()];
int ii=0;
用于(整数x:set){
newArray[ii++]=x;
}
返回新数组;
}
我天生懒惰。我会这样做:
--编辑--
private int[]不带重复项(int[]a){
Set Set=newlinkedhashset();
for(int x:a){
增加(x);
}
int[]newArray=newint[set.size()];
int ii=0;
用于(整数x:set){
newArray[ii++]=x;
}
返回新数组;
}
这是一个用于删除重复项和保持相对顺序的算法。
时间:O(n)
空格:O(n)
publicstaticvoiddupcheck(int[]a){
int j=0;
HashMap=newHashMap();
int[]b=新的int[a.长度];
对于(int i=0;i,这里有一个用于删除重复项并保持相对顺序的算法。
时间:O(n)
空格:O(n)
publicstaticvoiddupcheck(int[]a){
int j=0;
HashMap=newHashMap();
int[]b=新的int[a.长度];
对于(int i=0;iIt是n减去重复数。--n
它是n减去重复数。--n
它改变了它的顺序。我认为这可能是重复擦除方法未消除的副作用;)set.toArray(new int[]{})
不编译…如果方法签名使用Integer[]它会的。我假设它会执行自动取消装箱…我很快会更新。谢谢,很好的观察这里有一个固定的、可编译的实现。它还有保留顺序的额外好处。谢谢@pL4Gu33的捕获。它改变了它的顺序。我想这可能是重复擦除方法未消除的副作用;set.toArray(new int[]{})
不会编译…如果方法签名使用Integer[],它会编译。我假设它会执行自动取消装箱…我会很快更新。谢谢,很好的观察这是一个固定的、可编译的实现。它还有保留顺序的额外好处。感谢@pL4Gu33的捕获。
private int[] withoutDuplicates(int[] a){
Set<Integer> set = new LinkedHashSet<Integer>();
for (int x : a) {
set.add(x);
}
int[] newArray = new int[set.size()];
int ii = 0;
for (Integer x : set) {
newArray[ii++] = x;
}
return newArray;
}
public static void dupCheck(int [] a){
int j=0;
HashMap<Integer,Boolean> map = new HashMap<Integer,Boolean>();
int [] b = new int [a.length];
for(int i=0;i<a.length;i++){
if(!map.containsKey(a[i])){
map.put(a[i],true);
b[j++]=a[i];
}
}
for(int i=0;i<j;i++)
System.out.print(b[i]+" ");
}