LeetCode(27) - Remove Element

  这道题要求的是在数组nums里面删除和给定的target相同的数字。如[1,3,2,3,2,4,5],target = 2。最后输出是[1,3,3,4,5]。

  首先,输出的顺序并不做要求,第二,数组也不是sorted。思路总体来说和LeetCode26是相同的,就是把target相同元素用其他数字代替,因为返回的是数组的长度,所以我们可以优先从数组后面不同的元素来替换。举个例子,[1,3,2,3,2,4,5],当index = 2时,元素最后一个是5 != 2,所以有[1,3,5,3,2,4,5],下一个2的话就用倒数第二个不一样的数字——4,所以结果是[1,3,5,3,4,4,5],最后输出为7-2=5,所以结果是[1,3,5,3,4](顺序无所谓)。

  所以我们由前到后遍历需要一个指针,后面指向待替换数字替换需要一个指针。所以这题是一个two pointer的题目。

  代码如下:

 1 public class Solution {
 2     public int removeElement(int[] nums, int val) {
 3         //遍历数字是否为val
 4         int head = 0;
 5         //指向数组底部待换数字。
 6         int tail = nums.length - 1;
 7         //重复个数
 8         int count = 0;
 9         //要用等号,防止数组长度为1,且value为val的情况。
10         while (head <= tail) {
11             //tail是val的情况,则tail需要往前挪
12             if (nums[tail] == val) {
13                 tail--;
14                 count++;
15             }
16             //head遍历到val的时候,和tail交换,并更新count。
17             else if (nums[head] == val) {
18                 int temp = nums[tail];
19                 nums[tail] = nums[head];
20                 nums[head] = temp;
21                 head++;
22                 tail--;
23                 count++;
24             }
25             //nums[head]不为count的情况。
26             else {
27                 head++;
28             }
29         }
30         return nums.length - count;
31     }
32 }

 

  

posted @ 2016-03-16 12:00  可普CS之家  阅读(161)  评论(0编辑  收藏  举报