数组nums有n个元素,其中包含至少一个val值的元素。
删除数组中的所有val的值。
不能借助额外的数组。
空间复杂度为O(1)
比如数组元素为[1,4,5,4,3,4,5,4], 删除元素为4的值。
1.创建两个整型变量用于存储数组元素的索引(src和dest)
2. 让src和dest初始化为0,即均指向数组的首元素。
3. 如果元素等于val,则仅让src向后移动
4. 如果元素不等于val,则让该元素的值覆盖掉dest处的值,再让src和dest同时向后移动一位。
参考下图所示:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
// 函数参数:数组名、数组大小、要移除的元素值
// 函数返回值:移除指定元素后的数组长度
int removeElement(int* nums, int numsSize, int val)
{
int src = 0;
int dest = 0;
while (src < numsSize)
{
if (nums[src] != val)
{
nums[dest] = nums[src];
dest++;
}
src++;
}
return dest;
}
int main()
{
int arr[] = { 1,4,5,4,3,4,5,4 };
int len = sizeof(arr) / sizeof(arr[0]);
int dest = removeElement(arr, len, 4);
printf("%d\n", dest);
return 0;
}
数组是有序的
删除重复元素,即重复元素只保留一份
1. 原地修改
2. 空间复杂度为O(1)
3. 不能借助其他数组。
4. 返回去除重复元素后新数组的大小
1. 同删除元素的思路相同
2. 因为是有序的,所以只需要相邻的两个元素(元素的索引为prev和cur)一次比较,比较之后均向后移动一个元素
3. 如果两个元素不相等,则将前面的元素的值赋给目标索引(dest),然后dest++
4. 直到cur超出数组范围,把最后一个元素(prev索引指向的元素)赋值给dest,然后dest++
5. 返回dest即可。
6. 注意:如果数组为空数组,直接返回0
#include <stdio.h>
#include <stdlib.h>
// 函数参数:有序数组名、数组大小
// 函数返回值:移除重复元素后的数组大小
int removeDuplicates(int* nums, int numsSize) {
if (numsSize == 0) return 0;
//if (numsSize == 1) return 1;
int prev = 0;
int cur = 1;
int dest = 0;
while (cur < numsSize)
{
if (nums[prev] != nums[cur])
{
nums[dest] = nums[prev];
dest++;
}
cur++;
prev++;
}
nums[dest] = nums[prev];
++dest;
return dest;
}
int main()
{
int arr[] = {1,2,2,2,3,3,4,5,6,7,7,8};
int len = sizeof(arr) / sizeof(arr[0]);
int ret = removeDuplicates(arr, len);
printf("%d\n", ret);
int i;
for (i = 0; i < ret; i++) { printf("%d ", arr[i]); }
return 0;
}
原文:https://blog.51cto.com/u_15132389/2852130