From 4e78e2be81c1bb1cc3de577b30feb912a84a77d1 Mon Sep 17 00:00:00 2001 From: dingjiawen <745518019@qq.com> Date: Thu, 1 Sep 2022 20:05:13 +0800 Subject: [PATCH] =?UTF-8?q?leecode=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../markilue/leecode/array/RemoveElement.java | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/Leecode/src/main/java/com/markilue/leecode/array/RemoveElement.java b/Leecode/src/main/java/com/markilue/leecode/array/RemoveElement.java index 28ad860..eb6cdc8 100644 --- a/Leecode/src/main/java/com/markilue/leecode/array/RemoveElement.java +++ b/Leecode/src/main/java/com/markilue/leecode/array/RemoveElement.java @@ -1,4 +1,106 @@ package com.markilue.leecode.array; + +import org.junit.Test; + +import java.util.Arrays; + +/** + * 移除元素: + * 给你一个数组 nums和一个值 val,你需要 原地 移除所有数值等于val的元素,并返回移除后数组的新长度。 + * 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 + * 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 + */ public class RemoveElement { + + + @Test + public void test(){ + int[] nums = {3,2,2,3}; + int val = 3; + int length = removeElement3(nums, val); + System.out.println("数组:"+ Arrays.toString(nums)); + System.out.println("数组长度:"+length); + } + + public int removeElement(int[] nums, int val) { + + int deleteNum = 0; + for (int i = 0; i < nums.length-deleteNum; i++) { + if(nums[i]==val){ + int flag = i; + for (int j = nums.length-1-deleteNum; j > i; j--) { + if(nums[j]!=val){ + flag=j; + break; + } + deleteNum+=1; + } + if(flag==i){ + deleteNum+=1; + break; + } + exchange(nums,i,flag); + deleteNum+=1; + + } + } + return nums.length-deleteNum; + + } + + + /** + * 快慢指针法 + * 由于不考虑后面是什么东西,因此可以直接将其覆盖 + * @param nums + * @param val + * @return + */ + public int removeElement1(int[] nums, int val){ + + int slowIndex=0; + for (int fastIndex = 0; fastIndex < nums.length; fastIndex++) { + if(val!=nums[fastIndex]){ + nums[slowIndex++]=nums[fastIndex]; + } + + } + return slowIndex; + + } + + + /** + * 官方的快慢指针优化,双向奔赴 + * @param nums + * @param val + * @return + */ + public int removeElement3(int[] nums, int val) { + int left = 0; + int right = nums.length; + while (left < right) { + if (nums[left] == val) { + nums[left] = nums[right - 1]; + right--; + } else { + left++; + } + } + return left; + } + + /** + * 交换i,j + * @param nums + * @param i + * @param j + */ + public void exchange(int[] nums,int i,int j){ + int temp = nums[i]; + nums[i]=nums[j]; + nums[j]=temp; + } + }