• 算法------数组---------删除重复元素


     /**
         *   删除排序数组中的重复项
         给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
    
         不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
    
         示例 1:
    
         给定数组 nums = [1,1,2],
    
         函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
    
         你不需要考虑数组中超出新长度后面的元素。
         示例 2:
    
         给定 nums = [0,0,1,1,1,2,2,3,3,4],
    
         函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
    
         你不需要考虑数组中超出新长度后面的元素。
         */
    

    我的解决方法:

    public static int removeDuplicates(int[] nums) {
            if (nums == null) {
                return 0;
            }
    
            int length = nums.length;
            if (length < 2) {
                return length;
            }
            int temp = 0, j = length - 1;
            /**
             * 整体思路是冒泡排序相同的
             * 第一层循环,循环每一个数字i,
             * 第二层循环,从当前数字i 往后循环每一个数字j,
             * 如果发现i和j相等了,那么把j,用第三层循环,把j循环挪动到末尾,
             * 同时,数组的长度减一
             */
            for (int i = 0; i <= j; i++) {//遍历每一个数
                for (int k = i + 1; k <= j; ) {
                    if (nums[i] == nums[k]) {
                        int m = k + 1;
                        for (int q = k; m <= j; m++) {
                            if (nums[q] != nums[m]) {
                                temp = nums[q];
                                nums[q] = nums[m];
                                nums[m] = temp;
                                q = m;
                            }
                        }
                        j--;
                    } else {
                        k++;
                    }
                }
            }
            return ++j;
    }
    

    耗时有点高,网上给了最快的例子如下:

            if (nums.length == 0) return 0;
            if (nums.length == 1) return 1;
            int length = 1;
            int currentPos = 0;
            for (int i = 1; i < nums.length; i++) {
                if (nums[currentPos] != nums[i]) {
                    length++;
                    nums[++currentPos] = nums[i];
                }
            }
            return length;
    

    我尝试了下,该算法是有问题的,有的测试案例,返回的结果是不正确的。 比如,{0,0,1,1,2,2,0},他返回是:
    0,1,2,0 黑明显不对。

    今天我的博客专家没有申请通过,因为内容偏基础,我要加油提高自己的深度。努力写出来高质量的博客。他们给的不通过的理由,说实话,蛮认同的。加油,以后博客就是我成长的地方。

  • 相关阅读:

    c#常用的基础概念
    Visual Studio2010+SOS.dll调试入门 摘自 http://www.cnblogs.com/luminji/archive/2011/01/27/1946217.html
    优化数据库之前的10个问题
    js数组清空的两种方式
    我的资源(网站, 工具)
    iis使用十大原则
    SQL2005分页存储过程
    温故而知新:Delegate,Action,Func,匿名方法,匿名委托,事件
    无法获得数据库 'model' 上的排他锁 网上搜索结果 IT
  • 原文地址:https://www.cnblogs.com/caoxinyu/p/10568518.html
Copyright © 2020-2023  润新知