• 算法--------删除重复元素,但保留两个


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

    我的做法:

    public static int removeDuplicates2(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,iCount =0; k <= j; ) {
                    if (nums[i] == nums[k]) {
                        iCount ++;
                    }
                    if (nums[i] == nums[k] && iCount >=2) {
                        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;
            }
    

    网上最快的做法(但是都有问题)

            /**
             * 下面是网上最快的解答,但是有问题,
             * 有的测试案例,返回的结果是不正确的。
             *         int [] testArray = new int[]{4,4,1,1,1,0,0,4,4,0};
             */
           int i = 0;
            for (int num : nums) {
                if (i < 2 || num > nums[i - 2]) {
                    nums[i++] = num;
                }
            }
            return i;
    

    还有一个,也有问题:

            /**
             * 以下为网上解答
             *         int [] testArray = new int[]{4,4,1,1,1,0,0,4,4,0};
                这个测试用例通不过
             */
            if(nums == null || nums.length == 0 ){
                return 0;
            }
            if(nums.length ==1 ){
                return 1;
            }
            int k =0;
            for(int i=0; i<nums.length; i++){
    
                if(k<2 || nums[i]!=nums[k-2] ){
                    nums[k++] = nums[i];
                }
            }
            return k ;
    

    加油,争取成为一个算法高手。

  • 相关阅读:
    读取web.xml中设置的参数
    在服务端中,读取properties资源文件中的数据
    window下,nodejs安装http-server,并开启HTTP服务器
    跨域请求资源的方式
    IView 给Submenu增加click事件失效解决方案
    Vue -- mounted方法中调用methods的方法(并取出mounted方法中回调函数的值)
    IView 使用Table组件时实现给某一列添加click事件
    物联网协议CoAP协议学习
    电脑操作
    物联网协议
  • 原文地址:https://www.cnblogs.com/caoxinyu/p/10568517.html
Copyright © 2020-2023  润新知