代码训练营-day02-数组和链表

27.移除元素
题目:给你一个数组nums,和一个值val,需要将数组中值为val的元素移除,返回数组中不等于val的值的个数

输入:数组nums,值val,数组长度numsize
处理:移除数组中值为val的元素
输出:数组中不等于val值的个数,新的数组

思路:
1.排序,二分查找
2.直接移除

问题1:怎么形成新的数组
情况一:新建一个同等大小的数组,将不为val的元素加入新的数组(不行,题目里强调了是原地移除,不能新建数组)
没看到写错了

int removeElement(int* nums, int numsSize, int val) {
    int newnums[numsSize];
    int j=0;
    int i=0;
    int target=0;//没必要,i就是新长度
    while(numsSize--){//这里破坏了numsSize,导致return时返回值错误
        if(nums[j]==val){
            target++;
        }
        else {
            newnums[i]=nums[j];
            i++;
        }
        j++;
    }

    return numsSize-target

}

//改正版,但是加了新数组
int removeElement(int* nums, int numsSize, int val) {
    int newnums[numsSize];
    int j = 0;
    int i = 0;

    // 遍历所有元素
    while (j < numsSize) {
        if (nums[j] != val) {
            newnums[i] = nums[j];
            i++;
        }
        j++;
    }

    // 把新数组拷贝回原数组
    for (int k = 0; k < i; k++) {
        nums[k] = newnums[k];
    }

    // i 就是新长度
    return i;
}

情况二:将原数组中为val的删除,后面的元素向前移动(这个才是原题目的想要的答案)

int removeElement(int* nums, int numsSize, int val) {
    //暴力法:双层循环
   int size=numsSize;
   for(int i=0;i<size;i++){
    if(nums[i]==val){
        for(int j =i+1;j<size;j++){
            nums[j-1]=nums[j];
        }
        i--;
        size--;
    }
   }
   return size;
}

int removeElement(int* nums, int numsSize, int val) {
    //快慢指针
   int slowIndex=0;
   for(int fastIndex=0,int slowIndex=0;fastIndex<numsSize;fastIndex++){
    if(nums[fastIndex]!=val){
        nums[slowIndex++]=nums[fastIndex];
    }
   }
   return slowIndex;
}

posted @ 2026-05-13 11:39  lcmn  阅读(2)  评论(0)    收藏  举报