/*
*算法思路,题目中提到返回除val外的数组元素个数,那么从头遍历数组,设res的初值为数组的长度,遇到val就res--;
*同时题目中要求数组的前res个元素不能含有val,而且元素的顺序可以改变
*那么就将遍历时遇到的val放到数组的最后,设一个j,依次从数组的最后往前挪
*放到数组的最后采用交换nums[i]与nums[j],而且交换后还要判断nums[i]是否是val,所以for循环的i++是写在循环体内的if-else中的
*/
class Solution{
public int removeElement(int[] nums, int val) {
int res = nums.length;
int swap = 0;
for(int i = 0, j = nums.length - 1; i <= j; ){//将j作为循环控制条件,因为j之后的都是val
if(nums[i] == val){
swap = nums[j];
nums[j] = nums[i];
nums[i] = swap;
j--;
res--;
}
else{
i++;
}
}
return res;
}
}
/*
*解法二:设res的初值为0(解法一是设res的初值为数组的长度)
*从头遍历数组,如果遇到不等于val的元素,就将其挪到数组的前面(题目中要求数组的前res个元素不能是val)
*所以需要一个begin来指向数组的前面,挪一次就begin++
*/
class Solution{
public int removeElement(int[] nums, int val) {
int res = 0;
int begin = 0;
int swap = 0;
for(int i = 0; i < nums.length; i++){
if(nums[i] != val){
swap = nums[begin];
nums[begin] = nums[i];//直接这样赋值也可以通过,但为了不改变数组中所有的元素,采取交换的方式
nums[i] = swap;
begin++;
res++;
}
}
return res;
}
}