首页 > 编程语言 > 详细

C算法--原地移除-数组指定元素或者有序数组中重复元素

时间:2021-06-03 17:06:12      阅读:14      评论:0      收藏:0      [点我收藏+]

第一:删除指定元素

数组nums有n个元素,其中包含至少一个val值的元素。
删除数组中的所有val的值。

1.1. 要求

不能借助额外的数组。
空间复杂度为O(1)

1.2. 思路

比如数组元素为[1,4,5,4,3,4,5,4], 删除元素为4的值。
1.创建两个整型变量用于存储数组元素的索引(src和dest)
2. 让src和dest初始化为0,即均指向数组的首元素。
3. 如果元素等于val,则仅让src向后移动
4. 如果元素不等于val,则让该元素的值覆盖掉dest处的值,再让src和dest同时向后移动一位。
参考下图所示:

技术分享图片

1.3. 代码实现

#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;
}

技术分享图片

第二:删除有序数组中的重复值

2.1 数组描述

数组是有序的
删除重复元素,即重复元素只保留一份

2.2 要求

1. 原地修改
2. 空间复杂度为O(1)
3. 不能借助其他数组。
4. 返回去除重复元素后新数组的大小

2.3 思路

1. 同删除元素的思路相同
2. 因为是有序的,所以只需要相邻的两个元素(元素的索引为prev和cur)一次比较,比较之后均向后移动一个元素
3. 如果两个元素不相等,则将前面的元素的值赋给目标索引(dest),然后dest++
4. 直到cur超出数组范围,把最后一个元素(prev索引指向的元素)赋值给dest,然后dest++
5. 返回dest即可。
6. 注意:如果数组为空数组,直接返回0

2.4 代码实现

#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;
}

技术分享图片

C算法--原地移除-数组指定元素或者有序数组中重复元素

原文:https://blog.51cto.com/u_15132389/2852130

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!