这道题要求的是在数组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 }