给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素。元素的顺序可能发生改变。然后返回 nums
中与 val
不同的元素的数量。
假设 nums
中不等于 val
的元素数量为 k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。 - 返回
k
。
自己写的代码:
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
int removeElement(int* nums, int numsSize, int val) {
int j = 0;
int count = 0;
int* countTemp = (int*)malloc(numsSize * sizeof(int));
int* temp= (int*)malloc(numsSize * sizeof(int));
if (countTemp != NULL && temp != NULL)
{
for (int i = 0; i < numsSize; i++)
{
*(countTemp + i) = 1;
*(temp + i) = *(nums + i);
}
for (int i = 0; i < numsSize; i++)
{
if (*(nums + i) == val)
{
*(nums + i) = 0;
*(countTemp + i) = 0;
*(temp + i) = 0;
}
}
/*printf("nums=");
for (int i = 0; i < numsSize; i++)
{
printf("%d,", *(nums + i));
}
printf("\n");
printf("countTemp=");
for (int i = 0; i < numsSize; i++)
{
printf("%d,", *(countTemp + i));
}
printf("\n");
printf("temp=");
for (int i = 0; i < numsSize; i++)
{
printf("%d,", *(temp + i));
}
printf("\n");*/
for (int i = 0; i < numsSize; i++)
{
if (*(countTemp + i) != 0)
{
*(nums + j) = *(temp + i);
j++;
count++;
}
}
for (int i = j; i < numsSize; i++)
{
*(nums + i) = 0;
}
printf("nums=");
for (int i = 0; i < numsSize; i++)
{
printf("%d,", *(nums + i));
}
printf("\n");
}
return count;
}
int main(void)
{
int nums[] = {3,2,2,3};
int val = 3;
/*int nums[] = { 0,1,2,2,3,0,4,2 };
int val = 2;*/
int count= removeElement(nums,sizeof(nums)/sizeof(int),val);
printf("count=%d\n",count);
}
官方代码:
int removeElement(int* nums, int numsSize, int val) {
int left = 0;
for (int right = 0; right < numsSize; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}