删除有序数组中的重复项

最近更新于 2024-05-05 14:19

题目

已知一个有序数组 nums,原地删除重复的元素,使每个元素只出现一次,返回 nums 最终的长度。

分析

题目有要求,是在提供的原数组上删除重的元素。但是 C 语言本身的数组是静态的,不能直接删除元素。那么这个题目可以考虑使用双指针算法解答。

测试环境

gcc 9.4.0 – 64位

-no-pie -std=c17 -Wall -Werror=return-type -Werror=address -Werror=sequence-point -Werror=format-security -Wextra -pedantic -Wimplicit-fallthrough -Wsequence-point -Wswitch-unreachable -Wswitch-enum -Wstringop-truncation -Wbool-compare -Wtautological-compare -Wfloat-equal -Wshadow=global -Wpointer-arith -Wpointer-compare -Wcast-align -Wcast-qual -Wwrite-strings -Wdangling-else -Wlogical-op -Wconversion -g -O0 -lm

代码实现

#include <stdio.h>


int remove_duplicate(int *nums, int len)
{
    int s = 0;
    int f = 1;

    while (f < len)
    {
        if (s == 0 && f == s + 1 && nums[s] != nums[f])
        {
            ++s;
        }
        else if (nums[s] != nums[f])
        {
            ++s;
            nums[s] = nums[f];
        }
        else if (nums[s] == nums[f])
        {
            ++f;
        }
    }

    return s + 1;
}


int main()
{
    int nums1[] = {1,1,3,5,6,7,8};
    int nums2[] = {2,2,2,3,3,4,4,4,4,5,7,8,8,8,8};
    int nums3[] = {1,2,2,2,3,5,6,7,7,7,7,8};
    int nums4[] = {1,2,3,3,4,5};
    int nums5[] = {1,2,3,5,6,7,7,7,9};
    int nums6[] = {1,2,3,4,6,7,8};
    int nums7[] = {1,1,1,3,3,3,5,5,5};

    printf("%d\n", remove_duplicate(nums1, sizeof(nums1) / sizeof(int)));
    printf("%d\n", remove_duplicate(nums2, sizeof(nums2) / sizeof(int)));
    printf("%d\n", remove_duplicate(nums3, sizeof(nums3) / sizeof(int)));
    printf("%d\n", remove_duplicate(nums4, sizeof(nums4) / sizeof(int)));
    printf("%d\n", remove_duplicate(nums5, sizeof(nums5) / sizeof(int)));
    printf("%d\n", remove_duplicate(nums6, sizeof(nums6) / sizeof(int)));
    printf("%d\n", remove_duplicate(nums7, sizeof(nums7) / sizeof(int)));
}
删除有序数组中的重复项
Scroll to top