概述
数组作为编程入门的核心数据结构,其操作逻辑是算法学习的基石。从移除指定元素到合并有序数组,每一道经典题目的背后,都是对逻辑思维和代码掌控力的锤炼。学习算法没有捷径,唯有拆解原理、敲透代码,才能在一次次练习中沉淀能力。
一、移除元素
1.1 题目
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。

1.2 算法原理
核心思想是利用双指针将有效元素前移。
我们可以维护一个慢指针 cur,它指向下一个非目标值应该存放的位置。遍历数组时,如果当前元素不等于 val,就将其交换到 cur 指向的位置,然后 cur 自增。这样,数组前半部分就是所有非 val 的元素。
最后返回 cur + 1 即为新长度(因为下标从 0 开始)。
1.3 代码
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int cur = -1;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != val) {
swap(nums[i], nums[++cur]);
}
}
return cur + 1;
}
};
注意这里 swap 的使用是为了保持原有元素的相对顺序不变(虽然题目通常不要求顺序,但交换法在某些场景下更灵活)。实际运行中,当遇到需要移除的元素时,直接跳过;遇到保留的元素时,立即填入有效区。
二、合并两个有序数组
2.1 题目
给你两个按非递减顺序排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n,分别表示 nums1 和 nums2 中的元素数目。请将 nums2 合并到 nums1 中,使合并后的数组同样按非递减顺序排列。



