LeetCode027移除元素

28 阅读2分钟

题目:

给你一个数组 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)
}

以史为鉴.可以正衣冠.







如果大家喜欢我的分享的话.可以关注我的微信公众号

念何架构之路