给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
注意到上述描述中存在“元素的顺序可以改变”,数组无序,目的是去重,那么我们使用双指针来遍历及操作。
定义双指针left和right,left从0开始向右侧遍历,right从最后一位开始向左侧遍历,最坏情况下只遍历一次数组,效率较高。
当left值等于val时,将right位置的值赋值给left,right减1向左侧移动一位,下次若还相同,则继续将right位置的值赋值给left,right减1向左侧移动一位,直至left位置的值不等于val,将left加1,右移一位。代码如下:
func removeElement(_ nums: inout [Int], _ val: Int) -> Int {
guard nums.count > 0 else {return 0}
let cnt = nums.count
var left = 0, right = cnt
while left<right {
if nums[left] == val {
nums[left] = nums[right-1]
right -= 1
}else {
left += 1
}
}
return left
}
- (NSInteger) removeElement:(NSMutableArray *)nums val:(NSInteger)val {
if (nums.count <= 0) {
return 0;
}
NSInteger left = 0, right = nums.count;
while (left < right) {
if ([nums[left] integerValue] == val) {
nums[left] = nums[right-1];
right--;
}else {
left++;
}
}
return left;
}