[leetCode]27.移除元素
解法一 暴力法
定义一个指针i
指向nums第一位,向后遍历,如果遇到nums[i]=val
则将nums[i]
之后的元素整体向前移动一位
class Solution {
public int removeElement(int[] nums, int val) {
int len = nums.length;
int i = 0;//定义一个i指针指向数组第一位
for(; i < len;){
if(nums[i] == val){//如果当前元素为val,将当前元素之后的元素向前移动
for(int j = i; j < nums.length - 1; j++){
nums[j]=nums[j+1];
}
len--;
}else{//i++,得在这里控制i++
i++;
}
}
return len;
}
}
解法二 双指针法
定义一个快指针j
与慢指针i
,一开始指向首元素。如果nums[j]==val
,则递增j
跳过该元素,如果nums[j]!=val
则将nums[j]
赋值给nums[i]
class Solution {
//双指针法
public int removeElement(int[] nums, int val) {
int i = 0;//指向数组首元素
//j最开始指向首元素
for(int j = 0; j < nums.length; j++){
//j++跳过nums[j]=val的元素,
if(nums[j]!=val){
nums[i] = nums[j];
i++;
}
}
return i;
}
}
解法三 双指针法 --移除较少元素
当遇到 nums[i] = valnums[i]=val 时,可以将当前元素与最后一个元素进行交换,并释放最后一个元素。这实际上使数组的大小减少了 1。
class Solution {
//双指针法 --移除较少元素
public int removeElement(int[] nums, int val) {
int len = nums.length;
int i = 0;//定义一个i指针指向数组第一位
while(i < len){
if(nums[i] == val){//如果当前元素为val,将最后一个元素赋值给当前元素
nums[i]=nums[len-1];
len--;
}else{//i++,得在这里控制i++
i++;
}
}
return len;
}
}