力扣链接:27.移除元素
要求:不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
方法一:
思路:利用双指针,头指针指向首元素,尾指针指向最后一个元素。循环中begin指向的值等于val时,判断end所指向的值。
- 如果end所指向的值不等于val交换两元素值并移动指针,同时数组大小减一。
- 如果end所指向的值等于val,end指针向前移动,同时数组大小减一直到end所指向的值不等于val或退出循环。
需要注意的是循环条件中的" = “, 如果缺少” = "出现一个元素的情况下不会进入循环会出现错误,如图:
具体代码实现如下:
int removeElement(int* nums, int numsSize, int val){
int begin = 0,end = numsSize - 1; //定义两个指针
while(begin <= end) //循环条件begin <= end (可能存在只有一个元素的情况所以得加上" = ")
{
if(nums[begin] != val) //头指针不等于val向后走
{
begin++;
}
//如果遇见要移除的值并且end所指向的值不等于val
else if(nums[begin] == val && nums[end] != val)
{
nums[begin] = nums[begin] ^ nums[end]; //交换两个元素
nums[end] = nums[begin] ^ nums[end];
nums[begin] = nums[begin] ^ nums[end];
end--; //尾指针向前移动
numsSize--; //数组大小减一
begin++; //交换元素后头指针向后移动
}else{ //如果遇见要移除的值并且end所指向的值等于val
end--; //尾指针向前移动(寻找不等于val的元素)
numsSize--; //数组大小减一
}
}
return numsSize; //返回移除后的数组大小
}
方法二:
思路:不利用双指针,直接循环判断。定义一个变量cnt用于记录数组中val出现的次数,如果遇见val则cnt加一,否则把该值放在数组前面非val的位置 。最后返回原数组大小减去val出现次数(cnt)。
详细操作:以题目中示例1为例
第一步:
第二步:
第三步:
第四步:
具体代码实现如下:
int removeElement(int* nums, int numsSize, int val){
int cnt = 0;
for(int i = 0; i < numsSize; ++i)
{
if(nums[i] == val)
{
cnt++;
}else{
nums[i-cnt] = nums[i];
}
}
return numsSize-cnt;
}