题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
1.暴力解法:两个for循环
public int removeElement(int[] nums, int val) {
int length = nums.length;
for (int i = 0; i < length; i++) {
if (nums[i] == val){
for (int j = i; j < length-1; j++) {
nums[j] = nums[j+1];
}
i -- ;
length --;
}
}
return length;
}
/**
* 解释:两层for循环
* nums = {3, 2, 2, 3}, val = 3
* length = 4;
* int i = 0; i < 4;
* int j = 0; j < 3;
* nums[0] == val; 则将nums[0]剔除掉, nums[0] = nums[1],nums[1]=nums[2],nums[2]=nums[3],
* nums = {2,2,3,3}
* 由于所有元素的位置向前移动了一位,此时的nums[0]实际上是原nums数组的第二个元素,因此需要将索引i-1,i =0; 避免遗漏元素,
* 由于最后一位元素3,已经是多余的元素,因此同时需要将length长度-1, length = 3
*
* int i = 0; i < 4
* nums[1] != val;
*
* int i = 1; i < 4
* nums[1] != val;
*
* int i = 2; i<3
* nums[2]==val;
* j = 2 ; j < 3;
* nums[2] = nums[3]
* nums = {2,2,3,3}
* 由于所有元素的位置向前移动了一位,此时的nums[2]实际上是原nums数组的第4个元素,因此需要将索引i-1,i =1; 避免遗漏元素,
* 由于倒数第二位元素3,已经是多余的元素,因此同时需要将length长度-1, length = 2
*
* int i = 2; i <3
* nums[2] == val;
* j = 2 ; j < 1;
* 退出循环
*最后返回length 长度,由于length长度已经剔除了相等元素之后的长度,因此就是最终返回数组的长度
* */
public static int removeElement(int[] nums, int val) {
int index = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != val){
nums[index++] = nums[i];
}
}
return index;
}
/**
* nums = {3, 2, 2, 3}, val = 3
* 解释:
* index = 0
* i = 0 , nums[0] == val, index = 0
*
* i = 1 , nums[1] != val,
* index = 0; nums[index++] = nums[1],
* 此时数组是:nums = {2, 2, 2, 3}
* 赋值之后 index = 1
*
* i = 2, nums[1] != val,
* index = 1; numx[index++] = nums[2],
* 此时数组是:nums = {2, 2, 2, 3}
* 赋值之后 index = 2
*
* i = 3, nums[3] == val,
* index = 2;
*结束循环 返回index为2, 此时前两个元素已被赋值成与val不同的元素。
*
* 相等就跳过,不相等就赋值.
*/