/** * 可以使用双指针,匹配 l 针当前值是否等于 val ,相等就将 r 指针的值赋给 l,r指针往左移动一个,l 指针往右移动一格 * 如果r指针的值等于 val,r指针左移动 * 直到 l,r 指针相遇,程序结束,输出l-1指针的值,就是现在数组的长度(l多走了一格) */ public int removeElement(int[] nums, int val) { //定义左右指针 int l = 0; int r = nums.length - 1; while (l < r) { //左边指针 while (nums[l] == val && l < r) { //右指针移动到不是val的位置 while (nums[r] == val && l < r) { r--; } //左右指针值交换 // swap(nums[l], nums[r]); int temp = nums[l]; nums[l] = nums[r]; nums[r] = temp; l++; r--; } l++; } return l - 1; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/** * 快慢指针,快指针会跳过值等于val的元素,不等于val值的元素会赋给慢指针的位置,当快指针到达数组底部,慢指针的位置就是数组的长度 * * @param nums * @param val * @return */ public int fastShowPoint(int[] nums, int val) { int show = 0; for (int fast = 0; fast < nums.length; fast++) { if (nums[fast] != val) { //当快指针的值不等于val,则赋给慢指针 nums[show] = nums[fast]; show++;//分开两步,思路清晰 } } return show; }