Remove Element
题意:将一个list中某数删除,其他元素的顺序可以改变
解法:
O(n):从左到右遍历list,遇到elem,直接不管。遇到非elem,把它放到前面对应的位置。
O(n*logn):将数组排序,找到元素出现的地方,其他地方平移。
下面这代码又臭又长,我不能忍了,为何写出如此垃圾的代码。
public class Solution126 {
public int removeElement(int[] A, int elem) {
if (A.length==0){
return 0;
}
qsort(A,0,A.length-1);
if(A[0]==elem&&A[A.length-1]==elem){
return 0;
}
if (elem<A[0]||elem>A[A.length-1]){
return A.length;
}
if (A[A.length-1]==elem){
int pos=-1;
for (inti=A.length-1;i>=0;i--){
if (A[i]!=elem){
pos=i;
break;
}
}
return pos+1;
}
if (A[0]==elem){
int pos=-1;
for (inti=1;i<=A.length-1;i++){
if (A[i]!=elem){
pos=i;
break;
}
}
for (inti=pos;i<A.length;i++){
A[i-pos]=A[i];
}
return A.length-pos;
}
int pos=-1;
for (int i=1;i<A.length;i++){
if (A[i]==elem){
pos=i;
break;
}
}
int pos2=-1;
for (int i=A.length-2;i>=0;i--){
if (A[i]==elem){
pos2=i;
break;
}
}
for (int i=pos2+1;i<A.length;i++){
A[i-(pos2-pos+1)]=A[i];
}
return A.length-(pos2-pos+1);
}
privatevoid qsort(int[] a, int x, int y) {
inti=x;
intj=y;
intt=a[(i+j)/2];
do{
while(a[i]<t){
i++;
}
while(a[j]>t){
j--;
}
if(i<=j){
inttemp=a[i];
a[i]=a[j];
a[j]=temp;
i++;
j--;
}
}while(i<=j);
if(y>i){
qsort(a,i,y);
}
if(x<j){
qsort(a,x,j);
}
}
}