法一:普普通通
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len = nums.size();
int size = nums.size();
for (int i = 0; i < len; i++)
{
if (i == 0) {
nums.push_back(nums[i]);
continue;
}
if (i != 0 && nums[i] != nums[i - 1]) {
nums.push_back(nums[i]);
}
else {
size--;
}
}
// 在这里更改原数组
for (int i = 0; i < size; i++) {
nums[i] = nums[len + i];
}
return size;
}
};
法二:很酷的双指针
int removeDuplicates(vector<int>& nums) {
int s = nums.size();
if (s < 2)
return s;
int lft = 0, rgt = 0;
while(rgt++ < s - 1) {
if (nums[rgt] != nums[lft]) {
nums[++lft] = nums[rgt];
}
}
return lft + 1;
}
总结:
-
写出来一个很隐秘的bug,for循环里的跳出条件为 i<arr.size(); 然而在for循环循环体中却对arr调用了push_back()
-
c++数组报错内存不足常见的错误:内存越界访问 / 返回指向临时变量的指针
-
双指针中要分清使用:快指针慢指针 / 单侧开始两侧汇合