数组之移除元素

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;
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值