LeetCode 27.移除元素

LeetCode官网题目地址:力扣

Java实现代码:

 package array;
 ​
 import java.util.ArrayList;
 ​
 /**
  * @ClassName LeetCode 27.移除元素
  * @Description https://leetcode.cn/problems/remove-element/
  * @Author Jiangnan Cui
  * @Date 2022/10/23 19:58
  * @Version 1.0
  */
 public class LeetCode27 {
     /**
      * @MethodName removeElement
      * @Description 方法1:新建一个ArrayList,使用额外的空间来存储元素
      *              时间复杂度:O(n),其中,n为数组长度
      *              空间复杂度:O(n)
      *              但不满足题目要求
      * @param: nums 目标数组
      * @param: val 移除元素值
      * @return: int 返回不等于val的数组元素个数
      * @Author Jiangnan Cui
      * @Date 23:02 2022/10/24
      */
     public int removeElement(int[] nums, int val) {
         // 用ArrayList来保存满足要求的数组元素
         ArrayList<Integer> list = new ArrayList<Integer>();
         // 遍历数组
         for (int i = 0; i < nums.length; i++) {
             // 不等于val时
             if(nums[i] != val){
                 // 存入result
                 list.add(nums[i]);
             }
             // 等于val时,不做任何处理
         }
         // 遍历完成后,list的大小即为不等于val元素值的数组的长度
         // 注意:此处只为满足题目要求,即所得结果长度对应的原数组元素满足要求,不然测试时输出结果数组不对,不涉及原数组时不用考虑
         // 对原数组对应位置元素进行替换
         for (int i = 0; i < list.size(); i++) {
             nums[i] = list.get(i);
         }
         // 返回有效元素长度
         return list.size();
     }
 ​
     /**
      * @MethodName removeElement2
      * @Description 方法2:原地移除元素,通过复制元素实现
      *              时间复杂度:O(n),其中,n为数组长度
      *              空间复杂度:O(1),其中,需要常数个变量空间
      *              满足题目要求
      * @param: nums 目标数组
      * @param: val 移除元素值
      * @return: int 返回不等于val的数组元素个数
      * @Author Jiangnan Cui
      * @Date 23:02 2022/10/24
      */
     public int removeElement2(int[] nums, int val) {
         // 用作记录不等于val时的下标索引
         int index = 0;
         // 遍历数组
         for (int i = 0; i < nums.length; i++) {
             // 不等于val时
             if(nums[i] != val){
                 // 放入数组指定的index位置,同时index加1右移
                 nums[index++] = nums[i];
             }
             // 等于val时,不做任何处理
         }
         // 遍历完成后,index的大小即为不等于val元素值的数组的长度
         return index;
     }
 ​
     /**
      * @MethodName removeElement3
      * @Description 方法3:对方法2进行优化,避免两个元素相同时的重复赋值操作
      *              时间复杂度:O(n),其中,n为数组长度
      *              空间复杂度:O(1),其中,需要常数个变量空间
      *              满足题目要求
      * @param: nums 目标数组
      * @param: val 移除元素值
      * @return: int 返回不等于val的数组元素个数
      * @Author Jiangnan Cui
      * @Date 23:02 2022/10/24
      */
     public int removeElement3(int[] nums, int val) {
         // 用作记录不等于val时的下标索引
         int index = 0;
         // 遍历数组
         for (int i = 0; i < nums.length; i++) {
             // 不等于val时
             if(nums[i] != val){
                 // 判断两个位置是否相同,相同时不做处理,但index要加1,向右移动
                 if(i == index){
                     index++;
                 }else{// 两个位置不相同时。放入数组指定的index位置,同时index加1右移
                     nums[index++] = nums[i];
                 }
             }
             // 等于val时,不做任何处理
         }
         // 遍历完成后,index的大小即为不等于val元素值的数组的长度
         return index;
     }
 ​
     /**
      * @MethodName removeElement4
      * @Description 方法4:双指针法,通过while循环实现
      *              时间复杂度:O(n),其中,n为数组长度
      *              空间复杂度:O(1),其中,需要常数个变量空间
      *              满足题目要求
      * @param: nums 目标数组
      * @param: val 移除元素值
      * @return: int 返回不等于val的数组元素个数
      * @Author Jiangnan Cui
      * @Date 23:02 2022/10/24
      */
     public int removeElement4(int[] nums, int val) {
         // 用作记录不等于val时的下标索引
         int i = 0;
         // 用来指定边界
         int right = nums.length;
         // 循环条件
         while(i < right){
             // 当数组中元素值等于待移除元素值时
             if(nums[i] == val){
                 // 将右侧元素放到要移除元素的位置上进行元素替换
                 nums[i] = nums[right - 1];
                 // 此时右侧的元素已经替换掉左侧待移除的元素了,right指针左移,改变right指针位置
                 right--;
                 // 接下来判断交换的元素是否满足条件,即回到while循环条件判断处
             }else{
                 // 不相等时,i加1右移,right不变
                 i++;
             }
         }
         // 当i==right时,退出循环,此时i的大小即为不等于val时元素的个数
         return i;
     }
 ​
     /**
      * @MethodName removeElement5
      * @Description 方法5:对方法4进行进行优化,相同元素时不交换
      *              时间复杂度:O(n),其中,n为数组长度
      *              空间复杂度:O(1),其中,需要常数个变量空间
      *              满足题目要求
      * @param: nums 目标数组
      * @param: val 移除元素值
      * @return: int 返回不等于val的数组元素个数
      * @Author Jiangnan Cui
      * @Date 23:02 2022/10/24
      */
     public int removeElement5(int[] nums, int val) {
         // 用作记录不等于val时的下标索引
         int i = 0;
         // 用来指定边界
         int right = nums.length;
         // 循环条件
         while(i < right){
             // 当数组中元素值等于待移除元素值时
             if(nums[i] == val){
                 // 将右侧元素放到要移除元素的位置上进行元素替换
                 // 先判断右侧元素是否与当前元素相等,不相等时才交换元素,同时right减1左移
                 if(nums[i] != nums[right - 1]){
                     nums[i] = nums[right - 1];
                 }
                 // 相等时,不必交换,只需要right减1左移即可
                 right--;
                 // 此时右侧的元素已经替换掉左侧待移除的元素了,接下来判断交换的元素是否满足条件,即回到while循环条件判断处
             }else{
                 // 不相等时,i加1右移,right不变
                 i++;
             }
         }
         // 当i==right时,退出循环,此时i的大小即为不等于val时元素的个数
         return i;
     }
 ​
     /**
      * @MethodName removeElement6
      * @Description 方法6:对方法5的边界条件进行改变,测试使用
      *              时间复杂度:O(n),其中,n为数组长度
      *              空间复杂度:O(1),其中,需要常数个变量空间
      *              满足题目要求
      * @param: nums 目标数组
      * @param: val 移除元素值
      * @return: int 返回不等于val的数组元素个数
      * @Author Jiangnan Cui
      * @Date 23:02 2022/10/24
      */
     public int removeElement6(int[] nums, int val) {
         // 用作记录不等于val时的下标索引
         int i = 0;
         // 用来指定边界,此处改为数组最右侧索引下标
         int right = nums.length - 1;
         // 循环条件
         while(i <= right){
             // 当数组中元素值等于待移除元素值时
             if(nums[i] == val){
                 // 将右侧元素放到要移除元素的位置上进行元素替换
                 // 先判断右侧元素是否与当前元素相等,不相等时才交换元素,同时right减1左移
                 if(nums[i] != nums[right]){
                     nums[i] = nums[right];
                 }
                 // 相等时,不必交换,只需要right减1左移即可
                 right--;
                 // 此时右侧的元素已经替换掉左侧待移除的元素了,接下来判断交换的元素是否满足条件,即回到while循环条件判断处
             }else{
                 // 不相等时,i加1右移,right不变
                 i++;
             }
         }
         // 当i>right时,退出循环,此时i的大小即为不等于val时元素的个数
         return i;
     }
 ​
     public static void main(String[] args) {
         int[] nums = new int[]{3,2,2,3};
         int val = 3;
         int i = new LeetCode27().removeElement(nums, val);
         System.out.println("i = " + i);
         int[] nums2 = new int[]{3,2,2,3};
         int val2 = 3;
         int i2 = new LeetCode27().removeElement2(nums2, val2);
         System.out.println("i2 = " + i2);
         int[] nums3 = new int[]{3,2,2,3};
         int val3 = 3;
         int i3 = new LeetCode27().removeElement3(nums3, val3);
         System.out.println("i3 = " + i3);
         int[] nums4 = new int[]{3,2,2,3};
         int val4 = 3;
         int i4 = new LeetCode27().removeElement4(nums4, val4);
         System.out.println("i4 = " + i4);
         int[] nums5 = new int[]{3,2,2,3};
         int val5 = 3;
         int i5 = new LeetCode27().removeElement5(nums5, val5);
         System.out.println("i5 = " + i5);
 ​
         int[] nums6 = new int[]{0,1,2,2,3,0,4,2};
         int val6 = 2;
         int i6 = new LeetCode27().removeElement(nums6, val6);
         System.out.println("i6 = " + i6);
         int[] nums7 = new int[]{0,1,2,2,3,0,4,2};
         int val7 = 2;
         int i7 = new LeetCode27().removeElement2(nums7, val7);
         System.out.println("i7 = " + i7);
         int[] nums8 = new int[]{0,1,2,2,3,0,4,2};
         int val8 = 2;
         int i8 = new LeetCode27().removeElement3(nums8, val8);
         System.out.println("i8 = " + i8);
         int[] nums9 = new int[]{0,1,2,2,3,0,4,2};
         int val9 = 2;
         int i9 = new LeetCode27().removeElement4(nums9, val9);
         System.out.println("i9 = " + i9);
         int[] nums10 = new int[]{0,1,2,2,3,0,4,2};
         int val10 = 2;
         int i10 = new LeetCode27().removeElement5(nums10, val10);
         System.out.println("i10 = " + i10);
 ​
         int[] nums101 = new int[]{3,2,2,3};
         int val101 = 2;
         int i101 = new LeetCode27().removeElement6(nums101, val101);
         System.out.println("i101 = " + i101);
         int[] nums102 = new int[]{0,1,2,2,3,0,4,2};
         int val102 = 2;
         int i102 = new LeetCode27().removeElement6(nums102, val102);
         System.out.println("i102 = " + i102);
     }
 }

输出结果:

 i = 2
 i2 = 2
 i3 = 2
 i4 = 2
 i5 = 2
 i6 = 5
 i7 = 5
 i8 = 5
 i9 = 5
 i10 = 5
 i101 = 2
 i102 = 5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值