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.
A:
--------------------3rd pass------------------
不需要像前两次那样,用i,j两个指针。一个slow就够了。然后用for loop来遍历。
public class Solution { public int removeElement(int[] A, int elem) { if(A==null || A.length ==0) return 0; int slow = -1; for(int i =0;i<A.length;i++) if(A[i]!=elem) A[++slow]=A[i]; return slow+1; } }
-----------1 st pass-------------------
public class Solution { public int removeElement(int[] A, int elem) { if (A == null) { return 0; } int n = A.length; int i = 0; int j = n; // j point to the index of element that JUST(moved) equals to // elem while (i <= j) { // runng forward i ,to the first value of elem while (i < j && A[i] != elem) { i++; } // set the value at i as A[j-1] and update j if ( i < j && A[i] == elem ) { A[i] = A[j - 1]; j--; } else{ break; } } return j; } }
Mistakes:
1: 数组的边界检查,总是应该的
因为总是检查i<j了。 那么在update j 的时候,也需要检查是否越界。
-------------一个好的习惯就是,在用arrayIndex的时候,总是加上 检查越界的判断。
------------------------第二遍--------------------
public class Solution { public int removeElement(int[] nums, int val) { int endIndex = nums.length-1; for(int i =0;i<=endIndex;i++){ if(nums[i]==val){ nums[i] = nums[endIndex]; endIndex--; i--; } } return endIndex+1; } }
Learned:
No comments:
Post a Comment