26. 删除有序数组中的重复项

题目

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

 

难度简单

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

题解

方法一:采用异或运算。每次将相邻两个元素进行异或运算,如果结果为0就说明相邻两个位置的数相等,不做任何

处理,如果不相等就进行赋值运算。在这里使用两个变量frist、second,因为每次都是两个数进行判断,对于不相等的两个数将其赋值给nums,这样就直接在原数组上进行了修改。

注意:i 的判断条件,当i<numsSize时,i+1=numsSize,溢出数组的最大长度

int removeDuplicates(int* nums, int numsSize){
    int frist=0,second=1;
    for(int i=0;i<numsSize-1;i++){
        if(nums[i]!=nums[i+1]){
            nums[frist]=nums[i];
            nums[second]=nums[i+1];
            frist++;second++;

        }
    }
    return second;
}
时间复杂度:O(n)
空间复杂度:O(n)
posted @   一树懒  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示