题目来源:LeetCode
题目链接:点击跳转到原题
##### 第一部分:
(1)自己想到并实践的暴力解法
因为题目中说在本地完成重复数的删除,所以我想到一个最笨的方法,也是耗时最多的方法,“覆盖”。
利用外层循环来遍历数组,在遍历时进行判断,如果满足了出现重复数的情况,就在设置一个循环,将后面的 n - 1 个数分别向前移动一次。
在分支语句外面每次n减少1,这样就可以控制覆盖需要移动元素的个数。
因为是要通过有效数组的长度返回数组的元素,尽管现在完成了元素的覆盖,但是数组的长度是不变的。
我又想着在此遍历新数组,对于不为X的就计数一次(count),否则就跳出计数循环,最后在return count;
(2)在实践过程中遇到的问题
很明显,出现问题的地方为X。
对于没有分配空间的数组为 null,但是对于分配了空间但是没有赋值的数组所引出的值为 0,此处如果我用零来判断是否为结束循环的条件是不妥的,因为数组赋值本身就可能赋值为 0,所以我的方法以 失败而告终。
(3)此处是否有源码
if(BaoLiJieFa){
System.out.println("给出源码");
}else{
System.out.println("以防误导,不给出源码");
//因为没有参考价值
}
第二部分:
参考了题解,我学习了快,慢指针的方法。尽管对于这个概念我还是理解的不够透彻,但在本题中的应用理解的还可以。
- 代码部分:
class Solution {
public int removeDuplicates(int[] nums) {
//记录数组的长度
int len = nums.length;
//设置快慢指针
// int i = 0, j = 0; 在测试中,使用这种方法会出现两个问题
//问题1:会导致数组越界问题,可以控制循环的边界解决 i < len - 1
//问题2:对于最末尾一个数没有办法比较,所以就要通过改变指针的起点来解决
//设置成从后向前的比较就可以解决
int i = 1, j = 1;
for( ; i < len; i++){
//此处 i 为快指针, j 为满指针
if(nums[i] != nums[i-1]){
nums[j] = nums[i];
j++;
}
}
return j;
}
}
/*
利用 i 来遍历数组nums
然后用 j 来保存数组
我最开始想的是利用覆盖,然后记录有数值的元素为多少个,然后元素个数 但对于自动初始化
的元素的值为 null 和 为 0 都不对
*/