LeetCode OJ 27. Remove Element

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:

  1. Try two pointers.
  2. Did you use the property of "the order of elements can be changed"?
  3. What happens when the elements to remove are rare?

Subscribe to see which companies asked this question

【思路】

由于返回是数组的数字顺序可以改变,我们可以从后往前遍历。如果遇到的值和给定的val相同,则数组长度len-1,指针向前移动。如果遇到的值和val不同,则向前找到第一个和val值相同的数组元素,然后把这个元素和最后的元素交换位置。len = len - 1,尾指针继续向前移动。

举个例子,初始数组[3,2,2,3,4,3,5,5,3] val = 3

1. 尾指针 notval = len - 1 = 8,此时nums[notval] = 3,则指针向前移动,len - 1,数组变为[3,2,2,3,4,3,5,5]

2. notval = 7,nums[7] = 5 != 3,向前找到第一个等于3的数组元素,nums[5] = 3,此时令nums[5] = nums[7],len - 1,数组变为[3,2,2,3,4,5,5]

3. 重复上述过程,直到向前找不到值为val的数组元素,则可以返回[5,2,2,5,4,5]。

代码如下:

 1 public class Solution {
 2     public int removeElement(int[] nums, int val) {
 3         if(nums==null || nums.length==0) return 0;
 4         int len = nums.length;
 5         int notval, isval;
 6         for(notval = len - 1; notval >=0; notval--){
 7             if(nums[notval] == val) len = len - 1;
 8             else{
 9                 for(isval = notval - 1; isval >= 0; isval--)
10                     if(nums[isval] == val) break;
11                 if(isval < 0) return len;
12                 else{
13                     nums[isval] = nums[notval];
14                     len = len - 1;
15                 }
16             }
17         }
18         return len;
19     }
20 }
原文地址:https://www.cnblogs.com/liujinhong/p/5510709.html