移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

方法一、双指针

注意到上述描述中存在“元素的顺序可以改变”,数组无序,目的是去重,那么我们使用双指针来遍历及操作。 定义双指针left和right,left从0开始向右侧遍历,right从最后一位开始向左侧遍历,最坏情况下只遍历一次数组,效率较高。 当left值等于val时,将right位置的值赋值给left,right减1向左侧移动一位,下次若还相同,则继续将right位置的值赋值给left,right减1向左侧移动一位,直至left位置的值不等于val,将left加1,右移一位。代码如下:

Swift

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

if nums[left] == val {

nums[left] = nums[right-1]

right -= 1

}else {

left += 1

}

}

return left

}

OC

- (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;

}

好文推荐

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: