题目: 删除有序数组中的重复项
来自智得网
分析
Hash法
处理重复项需要循环处理数组中的每个数字。
使用一个 Hash 表保存已经遍历过的数字用于数组的去重。
用变量 k 记录最终数组中无重复数字的位置,
遍历数组中的每个数字,如果数字第一次出现,则将 k 进行加一, 同时将该数字存入 Hash 表,如果 Hash 表已经存在该数字,则继续往后处理。
数组循环结束之后返回 k 的值即可。
双指针
由于题目中的数组是已经升序排序的数组,相同的元素在数组中的位置相邻。所以就不需要使用 Hash 表进行去重,可以使用双指针的方法求解。
定义两个指针 i 和 j 分别指向数组的第一个元素,指针 j 循环向后移动。
在移动的过程中,比较两个指针指向的值,
如果两个值相等,那就说明是重复的元素, i 的位置不变。
如果两个元素不一样,那么就将指针 i 后移一位,并且将指针 j 指向的值拷贝到指针 i 的位置
继续上述的过程,当循环结束,i + 1 就是去重后数组的长度。
public class Solution{
public int solute(int[] nums) {
int i, j = 0;
for (i = 0, j = 0; j < nums.length; j++) {
if (nums[i] != nums[j]) {
nums[++i] = nums[j];
}
}
return i + 1;
}
}