题目:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例 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。
你不需要考虑数组中超出新长度后面的元素。
java:
//快慢指针.
public static int removeElement(int[] nums, int val) {
int slowIndex = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != val) {
nums[slowIndex] = nums[i];
slowIndex++;
}
}
return slowIndex;
}
//相向双指针.
public static int removeElementPointer(int[] nums, int val) {
int left = 0;
int right = nums.length - 1;
while (right >= 0 && nums[right] == val) right--;
while (left <= right) {
if (nums[left] == val) {
nums[left] = nums[right];
right--;
}
left++;
while (right >= 0 && nums[right] == val) right--;
}
return left;
}
public static int removeElementPointer2(int[] nums, int val) {
int left = 0;
int right = nums.length - 1;
while (left <= right) {
if (nums[left] == val) {
nums[left] = nums[right];
right--;
} else {
left++;
}
}
return left;
}
public static void main(String[] args) {
int[] nums = {3, 2, 2, 3};
int i = removeElement(nums, 3);
System.out.println(i);
int[] nums2 = {3, 2, 2, 3};
int i1 = removeElementPointer(nums2, 3);
System.out.println(i1);
int[] nums3 = {3, 2, 2, 3};
int i2 = removeElementPointer2(nums3, 3);
System.out.println(i2);
}
}
Go:
func RemoveElement(array []int, val int) int {
slow := 0
for fast := 0; fast < len(array); fast++ {
if array[fast] != val {
slow++
array[slow] = array[fast]
}
}
return slow
}
func RemoveElementPointer(array []int, val int) int {
left := 0
right := len(array) - 1
for left <= right {
if left <= right && array[left] != val {
left++
}
if left <= right && array[right] == val {
right--
}
if left < right {
array[left] = array[right]
left++
right--
}
}
return left
}
func main() {
array := []int{3, 2, 2, 3}
elementSize := LeetCode.RemoveElement(array, 3)
arrayPointer := []int{2, 3, 2, 3}
elementSizePointer := LeetCode.RemoveElementPointer(arrayPointer, 3)
fmt.Println(elementSize, elementSizePointer)
}
以史为鉴.可以正衣冠.
如果大家喜欢我的分享的话.可以关注我的微信公众号
念何架构之路