前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode每日一题Day4——26. 删除有序数组中的重复项

LeetCode每日一题Day4——26. 删除有序数组中的重复项

作者头像
命运之光
发布2024-03-20 12:54:56
1280
发布2024-03-20 12:54:56
举报
文章被收录于专栏:我在本科期间写的文章
26. 删除有序数组中的重复项

正确代码

方法一
代码语言:javascript
复制
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();
    }
};
方法二(建议使用)
代码语言:javascript
复制
class Solution 
{
public:
    int removeDuplicates(vector<int>& nums) 
    {
        // unique() 算法可以在序列中原地移除重复的元素,返回尾后迭代器
        auto it = unique(nums.begin(), nums.end());

        // 按题目要求,返回删除后数组的新长度即可
        return it - nums.begin();
    }
};

错误总结(个人)

第一次尝试提交的答案
代码语言:javascript
复制
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

错误原因

根据报错信息,问题出现在这一行代码:

代码语言:javascript
复制
if (a[nums[i]] != 0)

错误提示是在stl_vector.h文件中,发生了对空指针的非零偏移操作。问题在于你创建的vector<int> a没有初始化,它的大小是0,因此不能通过索引访问其中的元素。

你的目标是移除数组nums中的重复元素,并将不重复的元素存储在数组b中。我们可以采取以下方法进行修改:

代码语言:javascript
复制
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_setb数组中,同时更新计数count。这样就能实现移除重复元素的功能,并将不重复的元素存储在数组b中。

请注意,上述代码中的输出部分可能不是你需要的最终输出方式,仅仅为了演示结果而使用cout输出。如果你需要将结果返回给其他部分使用,可以将输出部分修改为合适的形式。

第二次尝试提交代码
代码语言:javascript
复制
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;
    }
};
解答错误

发现逻辑有问题,重新写。

第三次尝试提交代码
代码语言:javascript
复制
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来实现:

代码语言:javascript
复制
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来输出具体的元素值。

还是出错了

我研究了一下参考答案,发现是输出有问题,我改了一下输出,去掉了

代码语言:javascript
复制
cout << uniqueSet.length();

并将

代码语言:javascript
复制
for (auto element : uniqueSet) { 
    cout << element; 
}

这段代码逆序输出

修改后的代码为:
代码语言:javascript
复制
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();
    }
};
很好调试通过了
但提交后没有通过所有样例(对于负数的判断这里有问题)
再次修改

问题出现在这一行代码:

代码语言:javascript
复制
nums[--count] = *it;

在这里,你试图通过递减count来将元素赋值给nums数组,但这样的方式会导致负数索引。负数索引在C++中是无效的,会导致未定义行为。

为了正确地处理负数和保持原始顺序,我们可以使用另外一个数组来存储不重复的元素,并在遍历uniqueSet时按顺序将元素存储到这个数组中。然后再将这个数组的内容复制回原始的nums数组。

以下是修改后的代码:
代码语言:javascript
复制
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数组中。函数返回的是不重复元素的个数。

这个还是有问题,题目要求是升序输出

再次经行修改,修改代码为:
代码语言:javascript
复制
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%用户!!!)
代码语言:javascript
复制
class Solution 
{
public:
    int removeDuplicates(vector<int>& nums) 
    {
        // unique() 算法可以在序列中原地移除重复的元素,返回尾后迭代器
        auto it = unique(nums.begin(), nums.end());

        // 按题目要求,返回删除后数组的新长度即可
        return it - nums.begin();
    }
};

结语

再接再厉,继续加油!

本章的内容就到这里了,觉得对你有帮助的话就支持一下博主把~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正确代码
    • 方法一
      • 方法二(建议使用)
      • 错误总结(个人)
        • 第一次尝试提交的答案
          • 执行错误
            • 错误原因
              • 第二次尝试提交代码
                • 解答错误
                  • 第三次尝试提交代码
                    • 编译错误
                      • 编译出错
                        • 错误原因
                          • 还是出错了
                            • 修改后的代码为:
                              • 很好调试通过了
                                • 但提交后没有通过所有样例(对于负数的判断这里有问题)
                                  • 再次修改
                                    • 以下是修改后的代码:
                                      • 再次经行修改,修改代码为:
                                        • 再次提交(成功通过击败53.34%)
                                          • 为我提供思路的题解(建议使用~击败90%用户!!!)
                                          • 结语
                                          相关产品与服务
                                          对象存储
                                          对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
                                          领券
                                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档