java算法之简单的移除数组中的指定元素Remove Element

转载自:http://blog.csdn.net/ylyg050518/article/details/48526677

已对原文中的部分代码进行修改。

对于数组的操作是算法题目中经常会出现的类型,这次来看一个从数组中移除元素的问题。


问题描述

原文:

Given an array and a value, remove all instances of that value in place and return the new length. 
The order of elements can be changed. It doesn’t matter what you leave beyond the new length.

大意:给定一个数组和值,移除数组中与此值相同的元素,并返回新的数组长度。数组中的元素顺序可以被改变,只需要获取到新的数组长度,不需要考虑最终数组当中的元素排列状态。

思路分析

  这个题目看起来是如此简单,直观的想法就是可以统计数组中与指定值相同的元素个数,然后用原长度减去这个元素个数,就可以获得新数组的长度。

/**找到指定元素,并返回排除指定元素后数组的长度
	 * @param a	需要筛选的数组
	 * @param i	指定元素	
	 * @return	排除指定元素后数组的长度
	 */
	private static int m1(int[] a, int i) {
		int count=0;
		for (int j = 0; j < a.length; j++) {
			if(a[j]==i){
				count++;
			}
		}
		return a.length-count;
	}


  貌似这样写挺对的,再看看题目要求,其实上述写法是存在问题的,我们只是得到了数组的长度,但是数组当中的元素并没有任何改变,与elem相同的元素并没有被移除,没有办法筛选出移除后elem之后的数组元素,这样的算法显然是错误的。那么我需要改进算法。如果你有经验的话,你应该可以想到通过设置游标来指示与elem不同的元素,通过数组赋值将数组中和elem不同的元素依次移到数组头部。代码很简单,下面给出改进后的代码:

/**到指定元素,并返回排除指定元素后数组
	 * @param A	需要筛选的数组
	 * @param elem	指定元素	
	 * @return	排除指定元素后数组
	 */
	public static int[] removeElement(int[] A, int elem) {
        int index = 0;
        for (int i = 0; i < A.length; i++)
            if (A[i] != elem) {
                A[index] = A[i];
                index++;
            }
        int[] newArrays = Arrays.copyOf(A, index);
        return newArrays;
    }


  当然数组当中与elem相等的元素仍然是存在的,假如传入数组为{7, 4, 8, 4, 4, 4, 10},实际经过算法操作之后,数组变为{7,8,10,4,4,4,10} ,数组当中所有不等于elem的元素被移到前段,有效数组区间为{7,8,10},游标index值正好是有效的数组长度。这样是符合题目要求的。

Demo下载

你可能感兴趣的:(java,算法)