27。移除元素
题目:
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
注意这五个元素可为任意顺序。
你不需要考虑数组中超出新长度后面的元素。
看起来很简单,但是笨人用笨方法
先看看大佬的,直接覆盖,清晰明了
int removeElement(int* nums, int numsSize, int val){
int size = 0;
int i = 0;
for (i = 0; i <= numsSize - 1; i++)
{
if (nums[i] != val) // ignore the same
{
nums[size++] = nums[i];
}
}
return size;
}
再看看我的,利用了多少次循环不说。。还真的麻烦
int removeElement(int* nums, int numsSize, int val){
if(numsSize==0) return 0;
int k=0;
for(int i=0;i<numsSize;i++){
if(val==nums[i]) k++;//确认等于val的元素个数
}
for(int i=0;i<numsSize-k;i++){
if(val==nums[i]){//遍历到该元素
for(int j=numsSize-1;j>i;j--)
if(nums[i]!=nums[j]){
nums[i]=nums[j];//与后边不等于val的数交换,还要把这个数赋值为val,真粗。。
nums[j]=val;
break;
}
}
}
return numsSize-k;
}
数组本身很巧妙的,要巧妙 利用数组本身的空间
仔细想一想,我覆盖的空间肯定少于我遍历的空间,覆盖又不影响遍历怕他干个锤子!!