这篇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重新重组我们的数组,这时候我们的数组就会被不断的更新,最后就形成了一个新的数组,这跟我们的上面的暴力解法是完全不同的两个东西,暴力解法就是在破坏数组,进行把中间目标元素拿掉用后面的元素不断的覆盖,而指针法就是不断的重组,这就是今天我想分享的数组重组。