原题链接 : 添加链接描述
首先, 不得不吐槽一下这题的描述… 删除有序数组中的重复项, 而且不允许使用额外的数组空间, 看到这满头问号… 读了几遍才明白, 题目的意思是直接在原数组上修改, 最后返回修改后数组内无重复元素的范围.
思路其实也比较明了, 使用双指针, 一个跑的快在前面比较, 一个跑的慢的在后面做修改 , 当快指针发现当前下标值与上一个值不同时, 将慢指针向前移动一位, 并把快指针当前值赋予慢指针移动后的下标.
参考代码如下 :
// 这里的res是下标
int res = 0;
// 如果数组的长度小于等于1, 则不用处理,直接返回即可
if (nums.length <=1) return nums.length ;
// 从下标1开始往后比较
for (int i = 1 ; i < nums.length ; i ++ ){
// 如果当前数值不等于上一个数值
if (nums[i] != nums[i-1]){
// 先把res向前移动一位
res ++ ;
// 再把当前值赋予移动后的res
nums[res] = nums[i];
}
}
// 因为是需要输出长度, 所以这里需要把下标+1后再输出
res ++ ;
return res;