【初级算法】—— 数组去除重复数

题目来源: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 都不对



 */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bow.贾斯汀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值