这是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();
}
};
答案 0 :(得分:9)
vector<T>::size()
返回类型为size_t
的值,这是一种无符号类型。假设传入的向量为空,因此向量的长度为0. nums.size() - 1
将导致整数下溢,您实际上将0
与非常大的正数进行比较。这将评估为true,导致循环运行,i
将通过数组边界。
要解决此问题,您可以抢先将nums.size()
强制转换为int
,或将大小存储在整数变量中并与之进行比较。
答案 1 :(得分:2)
发布的函数适用于元素为[1 1 2]
的向量。请参阅https://ideone.com/ppuRg5。
然而,我在你的函数中看到的一个问题是,如果你传递一个空向量,它将遇到问题。
while(i < nums.size() - 1)
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();
}
答案 2 :(得分:2)
这不是您的问题的答案,但如果您不必在每次找到重复时调整矢量大小,那么这将是解决问题的更有效方法。只是为了给你一个想法,你可以有两个迭代器i和j,我保持解决方案向量的最后一个独特元素的索引,并且j迭代向量。当j指向不在前i个元素中的值时,将其复制到v [i]。完成后,从第j个位置开始删除所有内容。
答案 3 :(得分:0)
在我的情况下,此错误消息的原因是分段错误。
示例 对于空输入:
string longestCommonPrefix(vector<string>& strs) {
auto start = strs[0];
当我添加空输入检查时,效果很好
string longestCommonPrefix(vector<string>& strs) {
if (strs.size() == 0) {
return "";
}
auto start = strs[0];
答案 4 :(得分:0)
class Solution {
public:
int removeDuplicates(vector < int > & nums) {
for (int i = 1; i < nums.size(); i++) {
if (nums[i] == nums[i - 1]) {
nums.erase(nums.begin() + i);
i--;
}
}
return nums.size();
}
};
答案 5 :(得分:-1)
我只是想出了这一点,而不是直接将num.size()
与任何整数进行比较或运算
首先存储int n=num.size();
,然后像if(num=n-2)
进行比较。