给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
假设 nums
中不等于 val
的元素数量为 k
,要通过此题,您需要执行以下操作:
-
更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。 -
返回
k
。 -
提示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
java暴力代码(超时):
class Solution {
public int removeElement(int[] nums, int val) {
int size = nums.length;
for(int i=0;i<nums.length;i++){
if(nums[i]==val){
for(int j=i+1;j<nums.length;j++){
nums[j-1]=nums[j];
}
i--;
size--;
}
}
return size;
}
}
双指针法(快慢指针法):
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex=0;
for(int fastIndex=0;fastIndex<nums.length;fastIndex++){
if(nums[fastIndex]!=val){
nums[slowIndex]=nums[fastIndex];//更新数组
slowIndex++;
}
}
return slowIndex;
}
}
时间复杂度 O(n)
双指针法(快慢指针法):通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。
双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法。