Lettcode.27_Remove Element——指定された要素を配列から削除します。


この文章は学習中のまとめです。転載を歓迎しますが、出典を明記してください。http://blog.csdn.net/pistolove/article/details/41577997
Remove Element
Gven an array and a value、remove all instances of that value in place and return the new length.
The order of elemens can be changed.It doesn't mater what you leave beyond the new length.
考え方:
(1)この問題は簡単です。空間的な制限がないので、解決しやすいです。
(2)本明細書の方法は、チェーンを作成し、数字と異なる要素をチェーンに入れて、最後に得られたチェーンの長さを求めます。
(3)除去された残りの数字をデフォルトの順序で戻すためには、配列の順序を復元する必要があります。ここでは、直接チェーンテーブルを巡回して、要素を配列に対応させます。
(4)本文はただ問題を解く方法を提供するだけで、技術が限られているため、効率と空間の最適化はまだ関係がなくて、大神にとって、本文の計算方法はとてもごみに見えますが、あなたの助けにもなりたいです。
アルゴリズムに対応するコードを以下に示します。
public static int removeElement(int[] A, int elem) {
	int len = A.length;
	if (len == 0)
		return 0;
	List<Integer> list = new LinkedList<Integer>();

	for (int i = 0; i < len; i++) {
		if (A[i] != elem) {
		   list.add(A[i]);
		}
	}

	for (int i = 0; i < list.size(); i++) {
		A[i] = list.get(i);
	}

	return list.size();
}
上のアルゴリズムは数字に対してだけです。任意の対象に変更したら、私達は判断する時、==で判断するのではなく、equals()の方法で値の判断を行います。
同じ値の指定されたオブジェクトをオブジェクト配列から削除し、残りのオブジェクトの個数を返すアルゴリズムは以下の通りです。
public static int removeObject(Object[] A, Object elem) {
	int len = A.length;
	if (len == 0)
		return 0;
	List<Object> list = new LinkedList<Object>();

	for (int i = 0; i < len; i++) {
		if (A[i].equals(elem)) {
			list.add(A[i]);
		}
	}

	A = new Object[list.size()];
	for (int i = 0; i < list.size(); i++) {
		A[i] = list.get(i);
	}

	return list.size();
}