0%

LeetCode.移除元素

给你一个数组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
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    object RemoveArrayEle {
    def main(args: Array[String]): Unit = {
    println(solution1(Array(2), 2))
    println(solution1(Array(2), 3))
    println(solution1(Array(2, 2), 2))
    println(solution1(Array(2, 3, 3), 3))
    println(solution1(Array(3, 2, 2, 3), 3))
    println(solution1(Array(3, 2, 1, 2, 3, 2, 3), 3))

    println("------------------------------------------------")

    println(solution2(Array(2), 2))
    println(solution2(Array(2), 3))
    println(solution2(Array(2, 2), 2))
    println(solution2(Array(2, 3, 3), 3))
    println(solution2(Array(3, 2, 2, 3), 3))
    println(solution2(Array(3, 2, 1, 2, 3, 2, 3), 3))
    }

    /**
    * 双指针向内逼近
    */
    def solution1(nums: Array[Int], target: Int): Int = {
    if (nums.length == 0) return 0
    var l = 0
    var r = nums.length - 1
    while (l <= r) {
    if (nums(l) == target && nums(r) != target) {
    nums(l) = nums(r)
    nums(r) = target
    l += 1
    r -= 1
    }
    if (nums(r) == target) r -= 1
    if (nums(l) != target) l += 1
    }

    if (nums(0) == target) 0 else l
    }

    /**
    * 一次遍历
    */
    def solution2(nums: Array[Int], target: Int): Int = {
    if (nums.length == 0) return 0
    var i = 0
    for (j <- 0 until nums.length) {
    if (nums(j) != target) {
    nums(i) = nums(j)
    i += 1
    }
    }
    i
    }
    }