【JAVA 利用java栈与双指针两种方法解决移除元素】

一、问题重述

题目:给你一个数组 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;

    }

总结

以上是两种常见解决移除元素的方法,当然还会有其他的方法,这两种方法仅供参考,对比两种方法,双指针方法更为简洁推荐使用,对于使用栈的方法对于初学者不建议使用,但可以进行学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值