跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
编程语言大前端算法

LeetCode 移除元素与轮转数组解题思路

讲解 LeetCode 移除元素与轮转数组两道题目的解法。移除元素采用双指针法原地修改数组;轮转数组提供临时数组取模及三次反转两种方案。重点分析了 JavaScript 实现中的常见错误,如变量声明、取模逻辑及原地修改细节,并总结了数组操作的基础知识点与专注练习建议。

指针猎手发布于 2026/3/24更新于 2026/8/2258 浏览
LeetCode 移除元素与轮转数组解题思路

题目

1. 移除元素

题目描述: 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k。

示例 1: 输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2,,] 解释:你的函数应该返回 k = 2,并且 nums 中的前两个元素均为 2。

示例 2: 输入:nums = [0,1,2,2,3,0,4,2], val = 2 输出:5, nums = [0,1,4,0,3,,,_] 解释:你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。

提示:

  • 0 <= nums.length <= 100
  • 0 <= nums[i] <= 50
  • 0 <= val <= 100
C++ 实现
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int n = nums.size();
        int left = 0;
        for (int right = 0; right < n; right++) {
            if (nums[right] != val) {
                nums[left] = nums[right];
                left++;
            }
        }
        return left;
    }
};
JavaScript 实现
var removeElement = function(nums, val) {
    const n = nums.length;
    let left = 0;
    for (let right = 0; right < n; right++) {
        if (nums[right] != val) {
            nums[left] = nums[right];
            left++;
        }
    }
    return left;
};

2. 轮转数组

题目描述: 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

示例 1: 输入:nums = [1,2,3,4,5,6,7], k = 3 输出:[5,6,7,1,2,3,4] 解释:向右轮转 3 步后得到该结果。

示例 2: 输入:nums = [-1,-100,3,99], k = 2 输出:[3,99,-1,-100]

提示:

  • 1 <= nums.length <= 10^5
  • -2^31 <= nums[i] <= 2^31 - 1
  • 0 <= k <= 10^5
C++ 实现
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> newArr(n);
        for (int i = 0; i < n; ++i) {
            newArr[(i + k) % n] = nums[i];
        }
        nums.assign(newArr.begin(), newArr.end());
    }
};
JavaScript 实现
var rotate = function(nums, k) {
    const n = nums.length;
    k = k % n;
    let res = new Array(n);
    for (let i = 0; i < n; i++) {
        res[(i + k) % n] = nums[i];
    }
    for (let i = 0; i < n; i++) {
        nums[i] = res[i];
    }
};

代码分析与修正

在 JavaScript 实现轮转数组时,常见错误包括变量声明类型、取模逻辑及原地修改方式。

常见问题分析

  1. 语法错误:JavaScript 中声明变量不能用 int,应使用 let 或 const。
  2. 逻辑错误:旋转的核心公式应为 (i + k) % n,而非 (i + n) % k。且 k 可能大于数组长度,需先对 k 取模。
  3. 功能缺失:题目要求原地修改(modify nums in-place),不能直接 nums = res,必须逐个赋值 nums[i] = res[i]。

关键步骤解释

  • k = k % n:避免多余计算,例如数组长度 5,k=7 等价于 k=2。
  • 核心公式 (i + k) % n:利用取模运算实现循环索引,超出数组长度时回到开头。
  • 写回原数组:通过循环将临时数组 res 的值逐个赋给 nums,确保引用不变的情况下内容更新。

进阶优化

若不使用临时数组,可直接原地旋转(空间复杂度 O(1)),采用'三次反转法':

var rotate = function(nums, k) {
    const n = nums.length;
    k = k % n;
    
    const reverse = (arr, start, end) => {
        while (start < end) {
            [arr[start], arr[end]] = [arr[end], arr[start]];
            start++;
            end--;
        }
    };
    
    reverse(nums, 0, n - 1);      // 反转整个数组
    reverse(nums, 0, k - 1);      // 反转前 k 个元素
    reverse(nums, k, n - 1);      // 反转剩余元素
};

总结

  1. 核心知识点:双指针(移除元素)、取模运算(轮转数组)、原地修改技巧。
  2. 易错点:
    • 数组原地修改不能直接替换引用,需逐个赋值。
    • 轮转公式中索引与长度的关系,注意 k 取模处理。
    • 语言基础细节(如 JS 无 int 类型)。
  3. 学习建议:
    • 聚焦最小知识点闭环,拆解核心逻辑。
    • 限时练习,专注解决当前问题。
    • 复盘简化,用一句话总结核心解法。

这两道题无复杂算法,核心是数组基础操作与细节处理。通过手动计算例子对比错误代码可快速纠正理解偏差。

目录

  1. 题目
  2. 1. 移除元素
  3. C++ 实现
  4. JavaScript 实现
  5. 2. 轮转数组
  6. C++ 实现
  7. JavaScript 实现
  8. 代码分析与修正
  9. 常见问题分析
  10. 关键步骤解释
  11. 进阶优化
  12. 总结
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Java 运算符基础与使用指南
  • FPGA 快速傅里叶变换(FFT)IP 核配置与实现
  • 前端数据库 IndexedDB 详解:构建离线 Web 应用
  • Android 开发从零入门:学习路线与核心知识体系
  • SkyWalking .NET/C++/Lua 探针现状与社区支持
  • MacOS 下基于 Docker 部署 OpenClaw 并集成飞书机器人
  • 大模型技术详解:定义、架构与核心应用场景
  • C++ 类与对象进阶:默认成员函数与操作符重载
  • 使用 Git 将本地项目上传至 GitHub
  • 构建 AI 临床副驾驶:基于 Go 的电子病历智能助手与 HIS 对接实战
  • Web JS 逆向全体系详解
  • Stable Diffusion WebUI 为何被淘汰:ComfyUI 的崛起与 AIGC 工具迭代
  • HTTP 协议基础与 HTTPS 加密原理
  • HarmonyOS PC 与手机双端协同开发实战:UI 适配、窗口管理与性能调优
  • 基于 HTML5+CSS3+JavaScript 的高木同学圣诞树 GalGame 开发
  • MCP、Agent、Skills:AI 时代三大核心概念深度解析
  • Linux 常用指令详解与重定向实战
  • Python 在金融风险管理中的核心应用与实战指南
  • OpenClaw Zero Token 深度解析:浏览器自动化实现大模型免 Token 调用
  • AI 产品经理转型指南:核心能力与学习路径

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online