LeetCode记录之——Remove Element

这次题目Remove Element

很有意思的一道题,特别考验想象力——其实不是这样的。

思路很简单,就是从左右两边同时扫描,左边找一个要删除的,右边找一个不要删除的,然后换一下。注意是换,而不是赋值。

重点在于细节,想了下,有两点

首先,类似于

while( p < q &&A[p] != elem){
    p++;
}

的循环,当以前面的条件退出循环时,实际上是没有对A[p]的值进行检查的,要之后手动进行检查。

其次,当从某种表中执行“删除”操作时,要删除的彻底,比如设置标志位等。

代码:

public class Solution {
   public int removeElement(int A[], int elem){
		int len = A.length;
		if(len == 0){
			return len;
		}
		int p = 0;
		int q = len - 1;
		while(p <= q){
			while(p < q && A[p] != elem){
				p++;
			}
			if(p == q){
				return A[p] == elem ? p : p+1; // 对A[p]进行检查
			}
			while(p < q && A[q] == elem){
				q--;
			};
			if(p == q){
				return A[p] == elem ? p : p+1;
			}
			A[p++] = A[q];
			A[q--] = elem;    //删除的彻底一点
 		}
		return A[p] == elem ? p : p+1;
	}
}

正确的代码写出来应该是很漂亮的!


你可能感兴趣的:(LeetCode记录之——Remove Element)