最近更新于 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))); }
删除有序数组中的重复项