题目如下:
Given an array and a value, remove all instances of that value in place and return the new length.
Do not allocate extra space for another array, you must do this in place with constant memory.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
Example:
Given input array nums = [3,2,2,3]
, val = 3
Your function should return length = 2, with the first two elements of nums being 2.
Hint:
- Try two pointers.
- Did you use the property of "the order of elements can be changed"?
- What happens when the elements to remove are rare?
<span style="font-size:14px;"> public int removeElement(int[] nums, int val) {
int result=0;
int i=0;
int j = nums.length-1;
while(j>=0&&i<=j){
if(nums[j]==val){
j--;
result++;
continue;
}
if(nums[i]==val){
nums[i] = nums[j];
nums[j] = val;
j--;
result++;
}
i++;
}
return nums.length-result;
}</span>
然后是评论区代码,这个哥们的思路更加简单,我都不需要考虑最后的元素是不是已经被删除的元素,我只需要考虑前面的元素是不是都是未被删除的元素(其实这样写代码量更少,也更简单),思路大致就是这样,然后上评论区代码:
<span style="font-size:14px;"> public int removeElement(int[] nums, int val) {
int m = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] != val){
nums[m] = nums[i];
m++;
}
}
return m;
}</span>
有的时候考虑问题全面是好事,但是太全面了有时就会使关键点变得不那么明确,还是要具体问题具体分析吧!(说了一句大大的废话,闪人喽!)