从排序正整数数组中删除重复项
给定一个已经排序的正整数数组,需要在原地删除元素,是的每个元素之出现一次,然后返回移除后数组的新长度。不需要额外使用数组空间。
下面介绍的这种算法,基本想法是,判断相邻的两个元素是否相等,如果相等就将第二个元素的后面的所有元素向前移一个单位,覆盖掉重复项,同时将数组的最后一位设为0。如果相邻元素不相等,则索引i向后移一位。重新进行判断。当索引i后一位为0的时候,返回i+1。
public class Solution {
public static void main(String[] args) {
int[] nums = {1,1,2,2,3};
int len = removeDuplicates(nums);
for (int i = 0; i < len; i++) {
System.out.println(nums[i]);
}
}
public static int removeDuplicates(int[] nums) {
int i=0;
int max=nums[nums.length-1];
int numzero=0;
try {
while (nums[i + 1] != 0 && i + 1 < nums.length) {
if (nums[i] == nums[i + 1]) {
numzero = numzero + 1;
for (int j = i + 1; j < nums.length - 1; j++) {
nums[j] = nums[j + 1];
}
nums[nums.length - numzero] = 0;
}
if (nums[i] < nums[i + 1]) {
i = i + 1;
}
}
}catch(ArrayIndexOutOfBoundsException e){
};
return i+1;
}
}
下面这一种算法是采用两个标记i,j的方法,基本原理是一个在前一个在后,当每次两个位置的数字不一样时,把j位置处的值赋给I+1位置。此代码来源添加链接描述
public int removeDuplicates(int[] nums) {
int i=0;
for(int j=1;j<nums.length;j++){
if(nums[j]!=nums[i]){
i++;
nums[i]=nums[j];
}
}
return i+1;
}