一、问题重述
题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
要求:
1、不要使用除nums数组之外的数组空间。
2、元素的顺序可以进行改变。无需考虑数组中超出新长度后面的元素。
示例:
输入:nums = [1,4,5,3,5,7,1],val = 5
输出:5,nums = [1,4,3,7,1]
解释:方法应该返回新的长度5,并且新的数组应该包含 1,4,3,7,1 五个数字 但是我们不用考虑他们的顺序。
而且返回的数组 nums = [1,4,3,7,1,5,5] 或者 nums = [1,4,3,7,1,0,0] 也视为正确答案
二、问题分析
首先拿到问题之后,分析题目,题目需要原地的移除与val相等的元素,这里我们可以设置一个java栈将于val不相等的元素都放到栈中,后面取出来替换nums中元素即可,另一种方法即使用双指针的方法,设置i和j两个变量为数组的下标变量,利用i循环遍历nums数组,当找到与val不相同的元素时,通过j替换数组数据。
三、具体实现代码
1.Java栈解决
代码如下(示例):注意:在使用Stack类是一定要导包:
import java.util.Stack;
class Solution {
public int removeElement(int[] nums, int val) {
int a=0;//定义一个整型变量 来接收新数组的长度
Stack<Integer> sc=new Stack<>(); //创建Stack 栈
//遍历数组,将于val不同的数据放入栈中
for(int i=0;i<nums.length;i++){
if(nums[i]!=val){
sc.push(nums[i]);
a++;
}
}
//再次遍历替换数据
for(int j=0;j<nums.length;j++){
if(!sc.empty()){
nums[j]=sc.pop();
}
else{
nums[j]=0;
}
}
return a; // 返回新的数组长度
}
}
2.双指针解决
代码如下(示例):
public int removeElement(int[] nums, int val){
if (nums.length==0){
return 0; //首先判断特殊输入
}
//双指针法 双指针替换
int i = 0;
for (int j = 0; j < nums.length; j++) {
if (nums[j]!=val){
nums[i]=nums[j];
i++;
}
}
return i;
}
总结
以上是两种常见解决移除元素的方法,当然还会有其他的方法,这两种方法仅供参考,对比两种方法,双指针方法更为简洁推荐使用,对于使用栈的方法对于初学者不建议使用,但可以进行学习。