版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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};
最下面的6代表长度