这是leetcode 26.给定一个排序数组,就地删除重复项,使每个元素只出现一次并返回新的长度.给出一个例子nums = [1,1,2],函数应该返回[1,2].
以下是我的代码.我删除了所有其他副本,只留下其中一个.但是我总是reference binding to null pointer of type 'value_type'在提交时出错.如果有人能帮助我,我将不胜感激!
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i = 0;
while(i < nums.size() - 1) {
if (nums[i] == nums[i + 1]) {
nums.erase(nums.begin() + i);
}
else i++;
}
return nums.size();
}
};
Run Code Online (Sandbox Code Playgroud)
0x4*_*2D2 12
vector<T>::size()返回type的值size_t,这是一个无符号类型.假设传入的向量是空的,因此向量的长度为0. nums.size() - 1将导致整数下溢,您实际上将0与非常大的正数进行比较.这将评估为true,导致循环运行并i通过数组边界.
为了解决这个问题,你可以投nums.size()以int先发制人或大小存储在一个整型变量,而与之媲美.
正如发布的那样,该函数适用于元素为 的向量[1 1 2]。请参阅https://ideone.com/ppuRg5。
然而,我在你的函数中看到的一个问题是,如果你向它传递一个空向量,它就会遇到问题。
while(i < nums.size() - 1)
Run Code Online (Sandbox Code Playgroud)
当为空时就会出现问题nums。如果您发现它是一个空向量,您可以通过立即从函数返回来预先避免该问题。
另外,使用无符号类型以i避免编译器关于比较有符号类型和无符号类型的警告。
int removeDuplicates(std::vector<int>& nums) {
if ( nums.empty() )
{
return 0;
}
unsigned int i = 0;
while(i < nums.size() - 1) {
if (nums[i] == nums[i + 1]) {
nums.erase(nums.begin() + i);
}
else i++;
}
return nums.size();
}
Run Code Online (Sandbox Code Playgroud)