leetcode-27-easy
remove element
思路一: 先排序,然后去除数字
public static int removeElement(int[] nums, int val) {
Arrays.sort(nums);
int INVALID = -1;
int L = INVALID;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == val) {
L = i;
break;
}
}
int R = INVALID;
for (int i = L + 1; i < nums.length; i++) {
if (nums[i] != val) {
R = i;
break;
}
}
int count = 0;
if (L != INVALID) count += L;
if (R != INVALID) count += nums.length - R;
int left = L == INVALID ? 0 : L;
int length = R == INVALID ? 0 : nums.length - R;
while (length > 0 && R < nums.length) {
nums[left++] = nums[R++];
}
return count;
}
思路二: 双指针,left 指向需要移除的数字,right 碰到需要有效数字时和 left 交换。
right 向右移动时有两种情况
- 有效数字, 和 left 交换,left 自增
- 无效数字, 继续往右
为什么最后 left 的值可以当成有效数组长度用? 因为有效数组长度一定小于或者等于原数组长度,而 left 和 right 遇到有效数字时都会自增,完成有效数字记录(间接完成数组长度记录), left 永远指向下一个无效数字或者处于自增状态
public static int removeElement(int[] nums, int val) {
int left = 0;
for (int right = 0; right < nums.length; right++) {
if (nums[right] != val) {
nums[left++] = nums[right];
}
}
return left;
}

浙公网安备 33010602011771号