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

news2024/10/6 2:10:37

博主:命运之光 

🦄专栏:算法修炼之练气篇(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_setb数组中,同时更新计数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();
    }
};

结语

再接再厉,继续加油!


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

🌌点击下方个人名片,交流会更方便哦~
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/831420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 批量处理JSON文件,替换某个值

Python 批量处理JSON文件&#xff0c;替换某个值 直接上代码&#xff0c;替换key TranCode的值 New 为 Update。输出 cancel忽略 import json import os import iopath D:\\Asics\\850\\202307 # old path2 D:\\test2 # new dirs os.listdir(path) num_flag 0 for file…

采购分析:节省采购成本的 6 种方法

为了成功启动采购计划、稳定现金流并节省开支&#xff0c;企业需要了解从采购到付款的 P2P 周期的方方面面。 有远见的采购领导者将采购分析作为综合战略的一部分。因其有助于以简化和自动化的方式解决问题&#xff0c;从而更好地管理项目并节省大量成本。 什么是采购分析&am…

docker删除容器(步骤详解)

要在Docker中删除容器&#xff0c;需要使用命令docker rm。 下面是详细步骤&#xff1a; 1. 首先&#xff0c;使用docker ps命令查看当前正在运行的容器。这个命令会列出所有正在运行的容器的ID、名称、状态等信息。 如果没有正在运行的容器可以通过docker ps -a 查看当前所…

Java中的内存划分,一个数组的内存图

Java中的内存划分 Java的内存需要分成5个部分&#xff1a; 栈&#xff08;Stack&#xff09; 存放的都是 方法 中的 局部变量 。方法的运行一定要在栈当中运行。 局部变量&#xff1a;方法的参数&#xff0c;或者是方法{}内部的变量 作用域&#xff1a;一旦超出作用域&#xff…

Stable Diffusion教程(7) - PS安装AI绘画插件教程

配套教程视频&#xff1a;https://v.douyin.com/Uyux9F6/ 1. 前置条件 安装了stable diffusion 还没安装的从知识库安装 阿超的AI绘画知识库 语雀 安装了ps2023 还没安装的从网盘下载Win版 PS 2023【必须win10、11】.rar官方版下载丨最新版下载丨绿色版下载丨APP下载-12…

【雕爷学编程】MicroPython动手做(30)——物联网之Blynk

知识点&#xff1a;什么是掌控板&#xff1f; 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片&#xff0c;支持WiFi和蓝牙双模通信&#xff0c;可作为物联网节点&#xff0c;实现物联网应用。同时掌控板上集成了OLED…

Uiautomation实现CSDN同步同页面文章至社区(2023.08.03更新)

目录 运行代码前须知&#xff1a; 前言 技能Get1 代码主体部分 写在最后 运行代码前须知&#xff1a; 1.本次更新的代码是实现C站内容管理整页文章&#xff08;20篇文章&#xff09;同步到所有社区&#xff0c;因此需要自己先Ctrl滚轮实现25%放缩&#xff0c;使得页面能将…

迭代器模式——遍历聚合对象中的元素

1、简介 1.1、概述 在软件开发时&#xff0c;经常需要使用聚合对象来存储一系列数据。聚合对象拥有两个职责&#xff1a;一是存储数据&#xff1b;二是遍历数据。从依赖性来看&#xff0c;前者是聚合对象的基本职责&#xff1b;而后者既是可变化的&#xff0c;又是可分离的。…

【MySQL】仓储模块,核对出入库流水

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…

在敏捷项目中如何做好资源规划?

敏捷项目管理是一种交付项目的迭代方法&#xff0c;主要用于软件开发项目。该方法由多个迭代或增量步骤组成&#xff0c;以实现最终目标。在敏捷的环境下工作&#xff0c;难免遇到以下这些情况&#xff1a; ● 人员和团队通常必须将时间分配到不同的项目上。 ● 敏捷和非敏捷工…

【Linux】创建与删除用户

新增用户&#xff1a; adduser 用户名【添加用户】 passwd 用户名【设置用户密码】删除用户&#xff1a; userdel -r 用户名【删除用户】

字段填充策略 FieldFill

实体类中有如下属性&#xff0c;通过上面的自动填充属性&#xff0c;我们可以实现在进行插入&#xff08;insert&#xff09;操作时对添加了注解TableField(fill FieldFill.INSERT)的字段进行自动填充&#xff08;解释&#xff1a;后面会写配置自动填充的配置类&#xff0c;该…

举个栗子~Quick BI 技巧(2):创建柱线组合图

上一期举个栗子为数据粉们分享了如何简单几步创建趋势折线图&#xff0c;有一些数据粉发来疑问&#xff1a;如何利用 Quick BI 制作柱线图呢&#xff1f; 线柱图是一种非常重要且常用的组合图表&#xff0c;可以将两组数据在同一个表中直观的表达。今天的栗子&#xff0c;我们…

《吐血整理》高级系列教程-吃透Fiddler抓包教程(25)-Fiddler如何优雅地在正式和测试环境之间来回切换-下篇

1.简介 在开发或者测试的过程中&#xff0c;由于项目环境比较多&#xff0c;往往需要来来回回地反复切换&#xff0c;那么如何优雅地切换呢&#xff1f;宏哥今天介绍几种方法供小伙伴或者童鞋们进行参考。 2.实际工作场景 2.1问题场景 &#xff08;1&#xff09;已发布线上…

【微信小程序】van-uploader实现文件上传

使用van-uploader和wx.uploadFile实现文件上传&#xff0c;后端使用ThinkPHP。 1、前端代码 json&#xff1a;引入van-uploader {"usingComponents": {"van-uploader": "vant/weapp/uploader/index"} }wxml&#xff1a;deletedFile是删除文件函…

React入门学习笔记2

jsx语法规则 定义虚拟DOM时&#xff0c;不要写引号。标签中混入JS表达式时要用{ }。样式的类名指定不要用class&#xff0c;要用className。内联样式&#xff0c;要用style{{key&#xff1a;value}}的形式去写。只有一个根标签标签必须闭合标签首字母 )若小写字母开头&#xf…

C语言技巧 ----------调试----------程序员必备技能

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; &#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382;…

pytorch中torch.einsum函数的详细计算过程图解

第一次见到 rel_h torch.einsum(“bhwc,hkc->bhwk”, r_q, Rh)这行代码时&#xff0c;属实是懵了&#xff0c;网上找了很多博主的介绍&#xff0c;但都没有详细的说明函数内部的计算过程&#xff0c;看得我是一头雾水&#xff0c;只知道计算结果的维度是如何变化的&#xf…

IDEA使用数据库(新手入门详细教程)

第一步:将数据库服务器打开 进入你下载好的数据库路径到bin目录下cmd打开命令提示符界面 确认启动数据库 第二步&#xff1a;打开IDEA&#xff0c;找到IDEA数据库 第三步&#xff1a;选择要连接数据库 第四步&#xff1a;根据数据库信息连接数据库 连接之前的页面 输入我们要的…

常温超导:AI在研发中的潜力

目录 引言&#xff1a;1. 常温超导的挑战&#xff1a;2. AI在材料研究中的作用&#xff1a;3. AI在理论模型中的作用&#xff1a;4. AI与实验室合作的潜力&#xff1a;结论&#xff1a; 引言&#xff1a; 常温超导一直被认为是科学界的“圣杯”&#xff0c;可以在室温条件下实…