LeetCode 27.移除元素

移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

方法一、双指针

注意到上述描述中存在"元素的顺序可以改变 ",数组无序,目的是去重,那么我们使用双指针来遍历及操作。

定义双指针left和right,left从0开始向右侧遍历,right从最后一位开始向左侧遍历,最坏情况下只遍历一次数组,效率较高。

当left值等于val时,将right位置的值赋值给left,right减1向左侧移动一位,下次若还相同,则继续将right位置的值赋值给left,right减1向左侧移动一位,直至left位置的值不等于val,将left加1,右移一位。代码如下:

Swift

swift 复制代码
func removeElement(_ nums: inout [Int], _ val: Int) -> Int {
        guard nums.count > 0 else {return 0}
        
        let cnt = nums.count
        var left = 0, right = cnt
        while left<right {
            if nums[left] == val {
                nums[left] = nums[right-1]
                right -= 1
            }else {
                left += 1
            }
        }
        return left
    }

OC

c 复制代码
- (NSInteger) removeElement:(NSMutableArray *)nums val:(NSInteger)val {
    if (nums.count <= 0) {
        return 0;
    }
    
    NSInteger left = 0, right = nums.count;
    while (left < right) {
        if ([nums[left] integerValue] == val) {
            nums[left] = nums[right-1];
            right--;
        }else {
            left++;
        }
    }
    
    return left;
}
相关推荐
Slow菜鸟31 分钟前
Skill 学习篇(九)| 编排框架 · OpenSpec 专篇(1→10 阶段)
学习
今儿敲了吗1 小时前
链表篇(一)——合并两个有序链表
数据结构·笔记·算法·链表
豆豆1 小时前
国产化CMS选型实录:从零部署PageAdmin到麒麟系统的实战笔记
笔记·信创·国产化·建站系统·建站·内容管理系统·网站管理系统
kobesdu1 小时前
【ROS2实战笔记-14】多机器人系统的三层工具箱:从零基础集群到跨仿真实现
笔记·机器人·ros
星幻元宇VR1 小时前
VR雷霆双翼助力航空航天科普教育
科技·学习·安全·vr
知识分享小能手1 小时前
R语言入门学习教程,从入门到精通,集成开发环境RStudio(2)
开发语言·学习·r语言
alphaTao1 小时前
LeetCode 每日一题 2026/5/4-2026/5/10
算法·leetcode·职场和发展
大都督会赢的1 小时前
数据结构(1)--顺序表
c语言·数据结构·学习·指针
阿阳微客1 小时前
CS2饰品市场急跌,抄底时机是否已到?
笔记·学习·游戏
gz927cool1 小时前
【系统架构】可观测性设计及其应用——面向智能体开发视角
人工智能·学习·ai·系统架构