题目: 给你一个 非严格递增排列 的数组 nums
,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
判题标准:
系统会用下面的代码来测试你的题解:
int[] nums = [...]; // 输入数组 int[] expectedNums = [...]; // 长度正确的期望答案 int k = removeDuplicates(nums); // 调用 assert k == expectedNums.length; for (int i = 0; i < k; i++) { assert nums[i] == expectedNums[i]; }如果所有断言都通过,那么您的题解将被 通过。
虽然这个题用快慢指针比较简单,但是这个判题标准一定仔细阅读!!!!特别是这一句
assert k == expectedNums.length;
他的意思是你返回的k应该是数组的长度也就是size(),而我们一般返回的都是实际在数组中的索引,在实际长度的基础上减少了1,所以意味着我们在return的时候应该加上1.
代码如下:
class Solution {
public:
// 移除数组中的重复元素,并返回移除重复元素后数组的新长度
int removeDuplicates(vector<int>& nums) {
int slow = 0; // 慢指针,表示新数组的下一个插入位置的索引
int n = nums.size(); // 获取数组的大小,即元素个数
// 遍历数组,查找重复元素
for(int fast = 0; fast < n; fast++) {
// 如果当前元素与上一个不相同
if(nums[fast] != nums[slow]) {
slow++; // 慢指针后移一位
nums[slow] = nums[fast]; // 将当前元素复制到新数组的下一个插入位置
}
}
return slow + 1; // 返回新数组的长度,需要加上首个元素
}
};
谢谢大家,继续努力。