移除元素
题目:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。
示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
你不需要考虑数组中超出新长度后面的元素。
思路1(暴力解):
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
public class Delnumber { public static void main(String[] args) { System.out.println("请输入数组:"); int [] list = new int[10]; Scanner SC = new Scanner(System.in); xunhuanjianrshujv(list, SC); System.out.println("请输入要删除的数:"); int taget = SC.nextInt();//获取查找的数 int num = 0; int listfinally [] =jiego(list, taget); for (int i = 0; i < listfinally.length; i++) { System.out.println(listfinally[i]); } } private static int[] jiego(int[] list, int taget) { int count = 0; for (int num : list) {//
for (int num : list)
:遍历 list
数组中的每个元素,每次迭代都将当前元素的值赋给变量 num
。
if (num != taget) { count++; } } int[] result = new int[count]; int index = 0; for (int num : list) { if (num != taget) { result[index++] = num; } } return result; } private static void xunhuanjianrshujv(int[] list, Scanner SC) { for (int i = 0; i < list.length; i++) { System.out.print("请输入第"+(i+1)+"个数:"); int num = SC.nextInt(); list[i]=num; } } }
- 时间复杂度:O(n^2)
- 空间复杂度:O(1)
思路2(快慢指针法):
定义一个快指针和一个慢指针;
public class Delnumber { public static void main(String[] args) { int [] list ={1,3,3,4,3}; Scanner sc = new Scanner(System.in); System.out.println("input:"); int val = sc.nextInt(); int slowIndex=0; int num =getLength(list, val, slowIndex); System.out.println(slowIndex); } private static int getLength(int[] list, int val, int slowIndex) { for (int fastIndex = 0; fastIndex < list.length; fastIndex++) {//fastIndex快速遍历; if (list[fastIndex]!= val){//数据不同格式快慢指针都++,一起往前走 list[slowIndex]= list[fastIndex]; slowIndex++; } } return slowIndex;//最后返回的slowIndex即为数组最终的长度; } }
思路3(双指针法):
class Solution { public int removeElement(int[] nums, int val) { int left = 0; int right = nums.length - 1; while(right >= 0 && nums[right] == val) right--; //将right移到从右数第一个值不为val的位置 while(left <= right) { if(nums[left] == val) { //left位置的元素需要移除 //将right位置的元素移到left(覆盖),right位置移除 nums[left] = nums[right]; right--; } left++; while(right >= 0 && nums[right] == val) right--; } return left; } }