需求:
删除排序数组中重复的数字,允许重复两次。
分析:
和删除排序数组中的重复数字I类似,也是需要两个指针,一个用来遍历数组,一个用来记录有效的个数
1、当数组是null时,抛出异常
2、当数组长度是0,那么返回0
3、初始化变量index=1,用来表示有效数字的个数。
从前向后遍历数组,如果nums[i]!=nums[i-1],和前面的值不相同,那么nums[index++]=nums[i],i++;
如果nums[i]==nums[i-1],那么nums[index++]=nums[i]
判断i是否等于len-1,如果等于,然后直接返回index即可;
如果i不等于len-1,那么和其后面的元素进行比较
如果nums[i]!=nums[i+1],那么nums[index++]=nums[i+1],i+2
如果nums[i]==nums[i+1],
如果i=len-2,返回index
否则,用变量j从i+2开始遍历,求第一个不是nums[i]的值,然后赋给nums[index++],i=j+1,如果没有这样的j,就返回index。
最后返回index
代码:
public class Solution {
/**
* @param A: a array of integers
* @return : return an integer
*/
public int removeDuplicates(int[] nums) {
// write your code here
//如果nums是null,抛出异常
if(nums == null){
throw new IllegalArgumentException("invalid parameters");
}
if(nums.length == 0){
return 0;
}
//初始化有效个数index=1
int index = 1;
for(int i = 1; i < nums.length; ){
//如果nums[i]!=nums[i-1],那么赋值
if(nums[i] != nums[i-1]){
nums[index++] = nums[i];
i++;
}
else{
nums[index++] = nums[i];
//i如果是最后一个元素
if(i == nums.length-1){
return index;
}
else{
//将i和i+1比较
if(nums[i] != nums[i+1]){
nums[index++] = nums[i+1];
i += 2;
}
else{
//看i+1是否是最后一个元素
if(i == nums.length-2){
return index;
}
else{
//找第一个和nums[i]不相同的元素
int j = i+2;
for(;j < nums.length; j++){
if(nums[j] != nums[i]){
nums[index++] = nums[j];
i = j + 1;
break;
}
}
//判断for循环跳出的条件,如果没有和nums[i]不同的值,那么直接返回index即可
if(j == nums.length){
return index;
}
}
}
}
}
}
return index;
}
}