27号题目
1.两层for循环,暴力解法
需要注意的就是size-1与size的区别
2.双指针法(快慢指针法),快指针遍历数组,慢指针更新数组,都是从头开始遍历
3.相向双指针法,头尾分别设置指针,覆盖就行,思想很简单,但一定要注意循环条件,边界的判定比较费人,具体的我已经在代码注释中给出
//暴力解法
class Solution {
public int removeElement(int[] nums, int val) {
int i, j, size=nums.length; //设置size的目的是nums.length这个数不能动,只能通过自己设置的size来实现数组长度的变化
for (i = 0; i < size; i++){
if( nums[i] == val){ //查找到相同元素
for(j = i; j < size-1; j++){ //依次前移
nums[j] = nums[j+1];
}
size--; // 删除后,数组长度减一
i--; //由于前移了一次,所以本位置上的元素已经成为下一个位置上的元素,需要重新判断,于是i数值减一判断
}
}
return size;
}
}
//双指针法
class Solution {
public int removeElement(int[] nums, int val) {
int fast = 0, slow = 0; //设置两个快慢指针
for(;fast < nums.length; fast++){
if(nums[fast] != val){
nums[slow++] = nums[fast];//神来之笔,精髓所在
}
}
return slow;
}
}
//相向双指针法
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0, right = nums.length-1; //分别指向头尾
while(left <= right) {
while(left <= right && nums[left] != val) {//找到等于val的元素,加left <= right是防止后面全是与val不相等的元素时,left多加一,会造成最后多输出一个元素
left++;
}
while(left <= right && nums[right] == val) {//找到不等于val的元素,加left <= right是防止只有一个元素而且恰好与val相等时,此时运行会造成right的值小于0
right--;
}
if(left <= right){
nums[left++] = nums[right--];
}
}
return left;
}
}