移除元素(简单)
解答:
方法一:双指针法
定义两个指针i和j,i指针用来遍历nums数组。j指针用来填充数组。
i指针肯定比j指针走的快或者走的速度一样。首先用i指针遍历数组,如果当前元素和val数值不一样,就把i位置的元素复制到j位置上,并且让j向后挪动一位。如当前元素和val数值一样,就不让j向后移动,保持在当前位置。
class Solution {public int removeElement(int[] nums, int val) {int j=0;for(int i=0;i<nums.length;i++){if(nums[i]!=val){nums[j]=nums[i];j++;}}return j; }
}
方法二:双指针优化
使用两个左右指针,分别指向数组的开头和末尾。
判断当前左指针指向的元素,如果不等于val,左指针就向右移动,如果当前元素等于val,就把右指针位置的元素拿过来放在左指针的位置上。然后让右指针向左移动。
这里不用担心右指针指向的数值如果也是val怎么办,因为把右指针位置的数值拿过来之后,右指针向左移动的操作之后,就会进入下一个while循环,重新判断当前左指针的数字是不是val,如果还是(就是刚刚拿过来的右指针位置的数值还是val),就会把当前右指针的位置的数(右指针相比上次循环已经向左移动了,指向新的数值了)重新拿过来。
整个过程用while循环来做。
举了一个简单的例子:
class Solution {public int removeElement(int[] nums, int val) {int i=0;int j=nums.length-1;while(i<=j){if(nums[i]!=val){i++;}else{nums[i]=nums[j];j--;}} return i; }
}