先看下题目介绍: 给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1:
给定 nums = [3,2,2,3], val = 3,
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
你不需要考虑数组中超出新长度后面的元素。
解决这个问题的关键是不允许创建一个新的数组,也就是说只能在这个数组中操作,所以说思路应该是记那个无用的数字往数组后边移动(有的人可能会说为什么不是把无用的数字修改为一个特定的数字?是因为找不到一个合适的数字去替换无用的数字,找的数字本来可能在原数组中),所以在此处的思路可以是有了目标数字以后可以采取用后边的数字的不为目标数字的数字来替换,大体方向定下来以后就要考虑特殊的情况,首先就是数组为空,肯定是要返回0,然后就是数组中全是目标数字,也要返回0… 接下来上代码:
class Solution { public static int removeElement(int[] nums, int val) { if(nums.length==0){//首先是数组为空的情况 return 0; } int k=nums.length-1; for(int i=0;i<nums.length;i++){ if (nums[i]==val) { for(int j=k;j>=i;j--){ if (nums[j]!=val) { int tem=nums[i]; nums[i]=nums[j]; nums[j]=tem; k=j; break; }else if(j==i) {//数组中只有两个且为目标数字 k=j; break; } } }else if (k==0) {//数组中只有一个元素且为目标元素 return i+1; }else if(i==nums.length-1){//如果数组中只有最后一个元素是目标元素 return k+1; } if (k==i) {//外层循环的结束条件当位置到达一个点结束 break; } } return k; } }