删除有序数组的重复项

flag

软件学院大三党,每日一道算法题,第五天

题目介绍

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

思路

①因为元素最多出现两次,所以分为两种情况:
第一种:个数为1和2,无需删除
第二种:个数超过2,需要删除多余元素
②判断元素出现的次数:
最外层循环遍历原数组,i为当前index,保存值到temp中,下一层循环遍历i+1,i+2……直到对应的值不等于temp。
③删除元素:
将后续的元素index依次前移。

关键代码

    public static int removeDuplicates(int[] nums) {
        int len=nums.length;//新数组长度
        for (int i=0;i<nums.length;i++){
            int temp=nums[i];
            for (int j=i+1;j<nums.length;j++){
                if(nums[j]!=temp||len==j){//len==j适用于数组的最后一组重复数
                    int total=j-i;//total代表重复的个数
                    if(total<=2){
                        i+=(total-1);
                        break;
                    }

                    else {//删除多余重复数字
                        for (int k=i+2;k<nums.length-(total-2);k++){
                            nums[k]=nums[k+total-2];
                        }
                        i+=1;//跳过第二个重复数字
                        len-=(total-2);
                        break;
                    }


                }
            }
        }
//        for (int i = 0; i < len; i++) {
            System.out.println(nums[i]);
        }
        return len;

    }

解法2:

    public static int jiefa2(int []nums){
        int i = 0;
        for (int n : nums)
            if (i < 2 || n > nums[i-2])
                nums[i++] = n;
        return i;
    }

设计的非常精妙:充分利用了foreach取数组内容的特点,又巧妙的用i-2判断了是否要替换

测试

测试数据:int []test={1,1,1,2,2,2,2,3,3,3};
删除有序数组的重复项_第1张图片
最下面的6代表长度

你可能感兴趣的:(Java,数组,算法)