题目:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用0(1)额外空间并 原地 修改输入数组
答案:
int removeElement(int* num, int numSize, int val)
{
int prev = 0, bef = 0;
while (prev < numSize)
{
if (num[prev] != val)
{
num[bef] = num[prev];
bef++;
prev++;
}
else
{
prev++;
}
}
return bef;
}
解析:
1.我们首先审题
【1】不使用额外的数组空间表示我们不能创建新的数组空间即只能使用原数组来进行操作
【2】仅使用O(1)是指我们仅可以创建几个变量来做题
2.那么我们可以采用元素覆盖的方式来进行做题
为了使我们更好的理解本题目,这里我们假设nums[6] = { 1,2,3,3,3,4}
定义一个prev当前,一个bef之前变量
采用while循环,其中判断条件为(prev<numSize)
嵌入if语句进行判断
如果prev访问元素值不等于val,那么我们对bef访问的元素直接用prev访问元素值进行赋值,达到赋值操作
同时不忘对prev以及bef实行++操作
继续进行,即
如果prev访问元素值等于val,那么我们对bef访问的元素不进行操作,而prev进行++实行跳过目的,连续实行三步
【1】【2】
【3】
继续进行,prev访问元素值不等于val,那么我们对bef访问的元素直接用prev访问元素值进行赋值,对prev和bef实行++操作,此时prev == numSize,跳出while循环,并且返回bef-1的值,即覆盖原数组的元素个数
如果对您有帮助的话点一个免费的赞和收藏叭