题目
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 实现轮转数组时,常见错误包括变量声明类型、取模逻辑及原地修改方式。
常见问题分析
- 语法错误:JavaScript 中声明变量不能用
int,应使用let或const。 - 逻辑错误:旋转的核心公式应为
(i + k) % n,而非(i + n) % k。且k可能大于数组长度,需先对k取模。 - 功能缺失:题目要求原地修改(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); // 反转剩余元素
};
总结
- 核心知识点:双指针(移除元素)、取模运算(轮转数组)、原地修改技巧。
- 易错点:
- 数组原地修改不能直接替换引用,需逐个赋值。
- 轮转公式中索引与长度的关系,注意
k取模处理。 - 语言基础细节(如 JS 无
int类型)。
- 学习建议:
- 聚焦最小知识点闭环,拆解核心逻辑。
- 限时练习,专注解决当前问题。
- 复盘简化,用一句话总结核心解法。
这两道题无复杂算法,核心是数组基础操作与细节处理。通过手动计算例子对比错误代码可快速纠正理解偏差。


