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