思路:遍历数组,将等于指定值的元素和数组后面不等于指定值的元素交换位置。
C 代码:
// 找到最后一个不等于指定值的值的索引
int lastIndex(int numsSize, int* nums, int val) {
int last = numsSize - 1;
while (nums[last] == val) {
--last;
}
return last;
}
int removeElement(int* nums, int numsSize, int val) {
// 先找出数组中不等于指定值的元素的个数
int count = 0; // 记录数组中等于指定值的元素的个数
for (int i = 0; i < numsSize; i++) {
if (nums[i] == val) {
++count;
}
}
int res = numsSize - count; // 数组中不等于指定值的元素的个数
// 遍历数组,将数组的前 res 个元素变为非指定值,
// 等于指定值的元素交换到数组的后面去
for (int i = 0; i < res; i++) {
if (nums[i] == val) {
int index = lastIndex(numsSize, nums, val);
int tmp = nums[i];
nums[i] = nums[index];
nums[index] = tmp;
}
}
return res;
}
进行优化:
思路:使用双指针法,左指针 left
表示数组当前要赋值的索引,右指针 right
表示数组当前正在判断的元素的索引。数组直接进行原地修改,用 left
表示当前要修改的位置。用右指针 right
遍历数组。遍历结束后,左指针 left
表示数组中不等于指定值的元素的个数。
int removeElement(int* nums, int numsSize, int val) {
int left = 0;
for (int right = 0; right < numsSize; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
++left;
}
}
return left;
}
Java 代码:
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0;
for (int right = 0; right < nums.length; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
++left;
}
}
return left;
}
}