My second page-数组删除 —— By Nicolas

这篇page要讲的便是针对leetcode上面的27.移除元素,说实话啊,这一题小尼有点被恶心了,确实是小尼对循环的界限忘记了,所以前面提交了五次都是失败了,但是最后还是找出了问题,这个问题小尼用的是暴力循环解法,就是两层for循环解决问题,但是中间我出的问题就是我在第一次之后的开始循环的过程时,我把第一步的i没有归位,导致我每次继续循环是不断的在下一个元素进行,这使得通过的案例是有,但是就是走不完。先上一个我作物的代码。

int lengh = nums.length;
int val ;
Scanner in = new Scanner(System.in);
val = in.nextInt();
int s = lengh;
for(int i = 0;i<lengh;i++){
    if(nums[i] == val){
        for(int j = i;j<s;j++){
            nums[j] = nums[j+1];
        }
        s = s - 1;
    }
}
return s;

这种暴力的写法比较多简洁,不像有的暴力写法那么繁琐(这点有兴趣的小伙伴可以学习),但是这里面出的问题就是我的i和lengh在不断的循环的过程中它都是在增加或者不变的,在我遇到了一个指定元素之后,我的数组的元素的数量肯定是会减少的,而且那么就相当于我的数组收到了改变,那么我重遍历的时候,我的i值肯定需要从0开始进行,但是我在开始的代码没有做这一步操作,导致不断的通不过,这里也是在暴力法上面我觉得最难或者最重要的一点,一定要知道我的数组一旦发生了改变,那么我的递归的顺序还是要从头再来,那么一定要考虑的我的程序是否可以从头开始,上面的代码明显做不到,接下来继续拉一个正确的代码

int lengh = nums.length;
int val ;
Scanner in = new Scanner(System.in);
val = in.nextInt();
int s = lengh;
for(int i = 0;i<lengh;i++){
    if(nums[i] == val){
        for(int j = i;j<s;j++){
            nums[j] = nums[j+1];
        }
        s = s - 1;
    }
    i--;
    lengh--;
}

以上代码就也就加了两条,这两条也是在本题使用暴力解法的核心,就是需要注意到,我们的数组的遍历需要重新开始以及我们的数组的长度发生了变化。

接下来说一说小尼今天学到的覆盖的思想,这种方法的很多解法讲它称为指针解法,就是说定义两个指针,一个快指针,一个满指针,然后快指针不断的往前遍历我们的数组,满指针就是一个一个的记录,其实我觉得这是个覆盖的思想,就好比,我不断的派人去前方侦查敌情,然后我采取对应的措施,这里拉一下代码

int lengh = nums.lengh;

int fast = 0;

int slow = 0;

for(fast;fast<lengh;fast++){

        if(nums[fast]  != target){

                nums[slow] = nums[fast];

                slow++;

        }

}

return slow;

这里就是拿fast不断的往前探索,只要不是我的目标元素我就不断的用slow重新重组我们的数组,这时候我们的数组就会被不断的更新,最后就形成了一个新的数组,这跟我们的上面的暴力解法是完全不同的两个东西,暴力解法就是在破坏数组,进行把中间目标元素拿掉用后面的元素不断的覆盖,而指针法就是不断的重组,这就是今天我想分享的数组重组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值