LeetCode 26 Remove Duplicates from Sorted Array [Array/std::distance/std::unique] <c++>
给出排序好的一维数组,删除其中重复元素,返回删除后数组长度,要求不另开内存空间。
C++
很简单的题目,但是第一发RE了,找了很久问题出在哪。最后单步调试发现vector.size()
返回值是unsigned
型的。unsigned
型和int
型数据运算结果还是unsigned
型的。这就导致当数组为空时,nums.size()-1是一个大正整数,循环变量i很大时,执行了越界下标访问,出现了段错误。
/*
Status: Runtime Error
Runtime Error Message:
Line 933: Char 34: runtime error: reference binding to null pointer of type 'value_type' (stl_vector.h)
Last executed input:
[]
*/
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
unique(nums.begin(),nums.end());
for(unsigned i = 0; i < nums.size()-1; ++i) {
if(nums[i]>=nums[i+1])return i+1;
}
return nums.size();
}
};
虽然知道这个题用STL可以很方便,但是看到函数主体只有一行的代码时我还是感觉自己too young
/*
Status: Accepted
*/
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
return distance(nums.begin(),unique(nums.begin(),nums.end()));
}
};
然后去学了一发std::distance
的用法:就是返回两个迭代器之间的距离。
因为std::unique
返回最后一个不重复元素的迭代器,所以首迭代器与最后一个不重复元素的迭代器的距离就是不重复元素的个数,即数组长度。