✨博主:命运之光
🦄专栏:算法修炼之练气篇(C\C++版)
🍓专栏:算法修炼之筑基篇(C\C++版)
🐳专栏:算法修炼之练气篇(Python版)
✨博主的其他文章:点击进入博主的主页
前言:欢迎来到这个LeetCode每日算法题专栏!
🌊无论你是编程新手还是有一定经验的开发者,掌握算法和数据结构都是成功的关键。在这个专栏里,我将每天为你分享一道算法题,并提供简单易懂的解析和讲解。
☀️通过每日挑战,你将逐渐培养解决问题的思维方式,掌握重要的编程技巧。无论是面试准备还是日常编码,这些知识都将对你大有裨益。
🎉让我们一起开始这段充满乐趣和成长的学习之旅吧!希望你能从中受益,开拓编程的新视野!
目录
26. 删除有序数组中的重复项
正确代码
方法一
方法二(建议使用)
错误总结(个人)
第一次尝试提交的答案
执行错误
错误原因
第二次尝试提交代码
解答错误
第三次尝试提交代码
编译错误
编译出错
错误原因
还是出错了
修改后的代码为:
很好调试通过了
但提交后没有通过所有样例(对于负数的判断这里有问题)
再次修改
以下是修改后的代码:
再次经行修改,修改代码为:
再次提交(成功通过击败53.34%)
为我提供思路的题解(建议使用~击败90%用户!!!)
结语
26. 删除有序数组中的重复项
正确代码
方法一
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
set<int> uniqueSet; // 使用set来存储不重复的元素
for (int i = 0; i < nums.size(); i++) {
uniqueSet.insert(nums[i]);
}
int count = 0;
for (auto it = uniqueSet.begin(); it != uniqueSet.end(); ++it) {
nums[count++] = *it;
}
return uniqueSet.size();
}
};
方法二(建议使用)
class Solution
{
public:
int removeDuplicates(vector<int>& nums)
{
// unique() 算法可以在序列中原地移除重复的元素,返回尾后迭代器
auto it = unique(nums.begin(), nums.end());
// 按题目要求,返回删除后数组的新长度即可
return it - nums.begin();
}
};
错误总结(个人)
第一次尝试提交的答案
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
vector<int> a;
vector<int> b;
int count=0;
for(int i=0;i<nums.size();i++){
if(a[nums[i]]!=0)
{
a[nums[i]]=1;
b[count]=nums[i];
count++;
}
}
cout<<count;
for(int i=0;i<count;i++){
cout<<b[i];
}
return count;
}
};
执行错误
Line 1034: Char 34: runtime error: applying non-zero offset 4 to null pointer (stl_vector.h) SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:34
错误原因
根据报错信息,问题出现在这一行代码:
if (a[nums[i]] != 0)
错误提示是在stl_vector.h文件中,发生了对空指针的非零偏移操作。问题在于你创建的vector<int> a没有初始化,它的大小是0,因此不能通过索引访问其中的元素。
你的目标是移除数组nums中的重复元素,并将不重复的元素存储在数组b中。我们可以采取以下方法进行修改:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
vector<int> b;
int count = 0;
unordered_set<int> uniqueSet; // 使用unordered_set来存储不重复的元素
for (int i = 0; i < nums.size(); i++) {
if (uniqueSet.find(nums[i]) == uniqueSet.end()) {
uniqueSet.insert(nums[i]);
b.push_back(nums[i]);
count++;
}
}
cout << count;
for (int i = 0; i < count; i++) {
cout << b[i];
}
return count;
}
};
上述代码中,我们使用了unordered_set来存储不重复的元素。在遍历nums数组时,如果当前元素在unordered_set中不存在,就将它添加到unordered_set和b数组中,同时更新计数count。这样就能实现移除重复元素的功能,并将不重复的元素存储在数组b中。
请注意,上述代码中的输出部分可能不是你需要的最终输出方式,仅仅为了演示结果而使用cout输出。如果你需要将结果返回给其他部分使用,可以将输出部分修改为合适的形式。
第二次尝试提交代码
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
vector<int> b;
int count = 0;
unordered_set<int> uniqueSet; // 使用unordered_set来存储不重复的元素
for (int i = 0; i < nums.size(); i++) {
if (uniqueSet.find(nums[i]) == uniqueSet.end()) {
uniqueSet.insert(nums[i]);
b.push_back(nums[i]);
count++;
}
}
cout << count;
for (int i = 0; i < count; i++) {
cout << b[i];
}
return count;
}
};
解答错误
发现逻辑有问题,重新写。
第三次尝试提交代码
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
unordered_set<int> uniqueSet; // 使用unordered_set来存储不重复的元素
for (int i = 0; i < nums.size(); i++) {
if (uniqueSet.find(nums[i]) == uniqueSet.end()) {
uniqueSet.insert(nums[i]);
}
}
cout << uniqueSet.length();
for (int i = 0; i < uniqueSet.length(); i++) {
cout << uniqueSet[i];
}
return uniqueSet.length();
}
};
编译错误
编译出错
Line 10: Char 27: error: no member named 'length' in 'std::unordered_set<int, std::hash<int>, std::equal_to<int>, std::allocator<int>>' cout << uniqueSet.length(); ~~~~~~~~~ ^
错误原因
在C++中,std::unordered_set并没有名为length的成员函数。所以导致了编译错误。
如果你想输出uniqueSet中不重复元素的个数以及具体的元素值,可以通过遍历uniqueSet来实现:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
unordered_set<int> uniqueSet; // 使用unordered_set来存储不重复的元素
for (int i = 0; i < nums.size(); i++) {
if (uniqueSet.find(nums[i]) == uniqueSet.end()) {
uniqueSet.insert(nums[i]);
}
}
for (auto element : uniqueSet) {
cout << element;
}
return uniqueSet.size();
}
};
上述代码中,我们使用uniqueSet.size()来获取uniqueSet中不重复元素的个数,然后通过遍历uniqueSet来输出具体的元素值。
还是出错了
我研究了一下参考答案,发现是输出有问题,我改了一下输出,去掉了
cout << uniqueSet.length();
并将
for (auto element : uniqueSet) {
cout << element;
}
这段代码逆序输出
修改后的代码为:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
unordered_set<int> uniqueSet; // 使用unordered_set来存储不重复的元素
for (int i = 0; i < nums.size(); i++) {
if (uniqueSet.find(nums[i]) == uniqueSet.end()) {
uniqueSet.insert(nums[i]);
}
}
int count = uniqueSet.size();
for (auto it = uniqueSet.begin(); it != uniqueSet.end(); ++it) {
nums[--count] = *it;
}
return uniqueSet.size();
}
};
很好调试通过了
但提交后没有通过所有样例(对于负数的判断这里有问题)
再次修改
问题出现在这一行代码:
nums[--count] = *it;
在这里,你试图通过递减count来将元素赋值给nums数组,但这样的方式会导致负数索引。负数索引在C++中是无效的,会导致未定义行为。
为了正确地处理负数和保持原始顺序,我们可以使用另外一个数组来存储不重复的元素,并在遍历uniqueSet时按顺序将元素存储到这个数组中。然后再将这个数组的内容复制回原始的nums数组。
以下是修改后的代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
unordered_set<int> uniqueSet; // 使用unordered_set来存储不重复的元素
for (int i = 0; i < nums.size(); i++) {
if (uniqueSet.find(nums[i]) == uniqueSet.end()) {
uniqueSet.insert(nums[i]);
}
}
vector<int> uniqueArr;
for (auto it = uniqueSet.begin(); it != uniqueSet.end(); ++it) {
uniqueArr.push_back(*it);
}
int count = uniqueArr.size();
for (int i = 0; i < count; i++) {
nums[i] = uniqueArr[i];
}
return count;
}
};
在上述代码中,我们使用vector<int> uniqueArr来存储不重复的元素,并按顺序将元素添加到uniqueArr中。然后,我们再将uniqueArr中的内容复制回nums数组,并返回不重复元素的个数。
现在代码应该能够正确地移除重复元素,并将不重复的元素按原始顺序放回nums数组中。函数返回的是不重复元素的个数。
这个还是有问题,题目要求是升序输出
再次经行修改,修改代码为:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
set<int> uniqueSet; // 使用set来存储不重复的元素
for (int i = 0; i < nums.size(); i++) {
uniqueSet.insert(nums[i]);
}
int count = 0;
for (auto it = uniqueSet.begin(); it != uniqueSet.end(); ++it) {
nums[count++] = *it;
}
return uniqueSet.size();
}
};
再次提交(成功通过击败53.34%)
为我提供思路的题解(建议使用~击败90%用户!!!)
class Solution
{
public:
int removeDuplicates(vector<int>& nums)
{
// unique() 算法可以在序列中原地移除重复的元素,返回尾后迭代器
auto it = unique(nums.begin(), nums.end());
// 按题目要求,返回删除后数组的新长度即可
return it - nums.begin();
}
};
结语
再接再厉,继续加油!
本章的内容就到这里了,觉得对你有帮助的话就支持一下博主把~
🌌点击下方个人名片,交流会更方便哦~
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓