C++ 从已排序向量中删除重复项

C++ 从已排序向量中删除重复项,c++,C++,给定一个已排序的数组nums,在适当的位置删除重复项,以便 每个元素只出现一次并返回新的长度 不要为另一个数组分配额外空间,必须通过 使用O(1)个额外内存就地修改输入阵列 例1: 给定nums=[1,1,2] 函数应返回length=2,其中前两个元素为 nums分别为1和2 在返回的长度之外,您留下什么并不重要。例子 2: 给定'nums=[0,0,1,1,1,2,2,3,3,4] 函数应该返回length=5,包含前五个元素 分别修改为0、1、2、3和4的NUM的数量 在返回的长度之外设置

给定一个已排序的数组nums,在适当的位置删除重复项,以便 每个元素只出现一次并返回新的长度

不要为另一个数组分配额外空间,必须通过 使用O(1)个额外内存就地修改输入阵列

例1:

给定
nums=[1,1,2]

函数应返回length=2,其中前两个元素为 nums分别为1和2

在返回的长度之外,您留下什么并不重要。例子 2:

给定'nums=[0,0,1,1,1,2,2,3,3,4]

函数应该返回length=5,包含前五个元素 分别修改为0、1、2、3和4的NUM的数量

在返回的长度之外设置什么值并不重要。 澄清:

不明白为什么返回值是整数,而您的答案是整数 阵列

请注意,输入数组是通过引用传入的,这意味着 调用者也会知道对输入数组的修改

在内部,你可以这样想:

// nums is passed in by
reference. (i.e., without making a copy) int len =
removeDuplicates(nums);

// any modification to nums in your function would be known by the
caller. // using the length returned by your function, it prints the
first len elements. for (int i = 0; i < len; i++) {
    print(nums[i]); }

//nums是通过
参考资料。(即,不制作副本)int len=
移除的副本(nums);
//函数中对NUM的任何修改都将被
来电者使用函数返回的长度,它将打印
第一透镜元件。对于(int i=0;i
我在leetcode上提交时遇到此运行时错误。它在编码块上运行良好,但在leetcode编译器中显示此错误

第924行:字符9:运行时错误:引用绑定到“int”类型的空指针(stl_vector.h) 摘要:UndefinedBehaviorSanitizer:undefined behavior/usr/bin/./lib/gcc/x86_64-linux-gnu/8/../../../../../../include/c++/8/bits/stl_vector.h:933:9

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int k=nums[0];
        for(auto i=nums.begin()+1;i<nums.end();i++)
        {
            if(*i==k) nums.erase(i) , i--;
            else k=*i;
        }
        return nums.size();
    }
};
类解决方案{
公众:
int-removeDuplicates(向量和nums){
int k=nums[0];
对于(自动i=nums.begin()+1;i
  • 您的代码工作正常,缺少一个边缘大小写(一个空的
    nums
    ):
  • 更新代码:
  • 您的代码工作正常,缺少一个边缘大小写(一个空的
    nums
    ):
  • 更新代码:

nums.erase(i),i--
i=nums.erase(i)
您可以调用
sort
,然后调用
unique
。(和
erase
)。除非您出于某种原因想显式执行此操作,否则为什么不执行
nums.erase(std::unique(nums.begin(),nums.end())
?@TanveerBadar在这个问题的上下文中
从排序向量中删除重复项
确实不需要对
唯一的
进行
排序
。我想这就是Emma的评论。我的意思是,否则,
排序
对于OP的算法也是必需的。@OP,请注意t
nums.erase(std::unique(nums.begin(),nums.end())
也可以处理空向量。
nums.erase(i),i--
->
i=nums.erase(i)
您可以调用
sort
,然后
unique
(和
erase
)。除非出于某种原因要显式执行此操作,否则为什么不执行
nums.erase(std::unique(nums.begin(),nums.end())
?@TanveerBadar在这个问题的上下文中
从排序向量中删除重复项
确实不需要对
唯一的
进行
排序
。我想这就是Emma的评论。我的意思是,否则,
排序
对于OP的算法也是必需的。@OP,请注意t
nums.erase(std::unique(nums.begin(),nums.end())
也可以处理空向量。我不知道如何传递leetcode,但这不会删除任何内容。好吧,那只是……我认为应该为
leetcode
或竞争性编程问题添加一个标签,这样人们就不会浪费时间回答与编程无关的问题:(当然,这只适用于不想这样做的人。如果人们喜欢这类事情,那么这样做是完全合理的。嗯,真的吗?有没有关于这方面的元帖子或其他链接?我觉得这种性质的标签有充分的理由。@cigien这里是“问题”只是quesitons标题与实际需求不匹配(实际上只需要删除元素后容器的大小,即使没有容器也可以得到),但总的来说,我完全同意
leetcode
标签或
竞争性编码
,总的来说@TanveerBadarI不知道如何传递leetcode,但这并没有删除任何内容。嗯,那只是……我认为应该为
leetcode
或竞争性编程问题设置标签,这样人们就不会被忽略e回答与编程无关的问题的时间:(当然,这只适用于不想这样做的人。如果人们喜欢这类事情,那么这样做是完全合理的。嗯,真的吗?有没有关于这方面的元帖子或其他链接?我觉得这种性质的标签有充分的理由。@cigien这里是“问题”只是quesitons标题与实际需求不匹配(实际上只需要删除元素后的容器大小,即使没有容器也可以得到),但总体而言,我完全同意@TanveerBadar中的
leetcode
标记或
竞争编码
            if (nums.empty()) {
                return 0;
            }
class Solution {
    public:
        int removeDuplicates(vector<int>& nums) {
            if (nums.empty()) {
                return 0;
            }

            int k = nums[0];

            for (auto i = nums.begin() + 1; i < nums.end(); i++) {
                if (*i == k) {
                    nums.erase(i) , i--;
                }

                else {
                    k = *i;
                }
            }

            return nums.size();
        }
};
// Most of headers are already included;
// Can be removed;

#include <cstdint>
#include <vector>

// Start
static const struct Solution {
    using SizeType = std::uint_fast16_t;
    static const int removeDuplicates(
        std::vector<int>& nums
    ) {
        const SizeType len = std::size(nums);
        SizeType count = 0;

        for (SizeType i = 1; i < len; ++i) {
            if (nums[i] == nums[i - 1]) {
                ++count;

            } else {
                nums[i - count] = nums[i];
            }
        }

        return len - count;
    }
};