[C语言][LeetCode][80]Remove Duplicates from Sorted Array II

本文探讨如何在排序数组中移除多余的重复项,使得每个元素最多只出现两次,并提供了一种有效的C语言解决方案。通过遍历数组并使用计数变量,确保每个数字最多只被保留两次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

Remove Duplicates from Sorted Array II
Follow up for “Remove Duplicates”:
What if duplicates are allowed at most twice?

For example,
Given sorted array nums = [1,1,1,2,2,3],

Your function should return length = 5, with the first five elements of nums being 1, 1, 2, 2 and 3. It doesn’t matter what you leave beyond the new length.

标签

Array、Two Pointers

难度

中等

分析

题目意思是给定一个排序了的整形数组,返回一个所有数字最多出现两次的数组。

解题思路是,遍历数组,用count变量统计新的数组大小,因为最多能出现两次,所以不管遍历数组前面两个是什么数字,都放到新的数组里存储,即nums[count++] = nums[i];然后继续往后遍历,如果当前的数字nums[i]比nums[count-2]大,说明这两个数字不相同,那就把nums[i]所对应的值放到新的数组里存储,直到遍历结束。

C代码实现

int removeDuplicates(int* nums, int numsSize) {
    int i=0, count=0;

    for(i=0; i<numsSize; i++)
    {
        if(count<2 || nums[i]>nums[count-2])
            nums[count++] = nums[i];
    }

    return count;
}
### C语言 LeetCode 解题思路及实现 #### 题目背景 在LeetCode平台上,许多算法问题可以通过C语言来解决。以下是几个常见的C语言解法及其对应的逻辑分析。 --- #### 有效括号验证 (Valid Parentheses) **描述**: 判断给定的字符串是否由有效的括号组成。 **解决方案**: 使用栈结构模拟匹配过程。每当遇到左括号时将其压入栈中;当遇到右括号时,则尝试弹出栈顶元素并判断其是否与当前右括号匹配。如果最终栈为空则说明输入合法[^2]。 ```c #include <stdbool.h> #include <string.h> bool isValid(char* s) { int length = strlen(s); if(length % 2 != 0){ return false; } char stack[length]; int top = -1; for(int i=0;i<length;i++){ if(s[i]=='(' || s[i]=='{' || s[i]=='['){ stack[++top]=s[i]; // Push to stack. }else{ if(top == -1){return false;} char c = stack[top--]; // Pop from stack. if( ((s[i]==')') && (c!='(')) || ((s[i]=='}') && (c!='{')) || ((s[i]==']') && (c!='[')) ){ return false; } } } return top == -1 ? true : false ; } ``` --- #### 字符串反转 (Reverse String) **描述**: 将输入字符串逆序输出。 **解决方案**: 创建一个新的字符数组用于存储翻转后的结果,并通过索引计算完成逐字拷贝操作[^3]。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> char* reverseString(const char* s) { size_t len = strlen(s); char* result = malloc((len + 1) * sizeof(char)); for(size_t i = 0; i < len; ++i){ result[i] = s[len - i - 1]; } result[len] = '\0'; return result; } int main(){ const char str[]="hello"; char* reversedStr = reverseString(str); printf("Original:%s\nReversed:%s\n",str,reversedStr); free(reversedStr); return 0; } ``` --- #### 数组去重 (Remove Duplicates from Sorted Array) **描述**: 给定一个已排序的整型数组nums,在原地删除重复项使得每个唯一元素只出现一次,并返回新长度。 **解决方案**: 运用双指针技术分别追踪读取位置(fast)以及写入位置(slow)[^5]。 ```c int removeDuplicates(int* nums, int numsSize){ if(numsSize==0)return 0; int slow=0; for(int fast=1;fast<numsSize;fast++){ if(nums[fast]!=nums[slow]){ slow++; nums[slow]=nums[fast]; } } return slow+1; } ``` --- #### 整数位数分解与判定 (Divisor Game) **描述**: 对于正整数N,玩家可以选择任意小于等于该数值的最大因数X(N>X),然后更新N=N-X直到无法继续游戏为止。问是否存在必胜策略? **解决方案**: 提取出每位上的数字逐一检验能否被目标值整除即可得出结论[^4]。 ```c #include<stdio.h> // Function checks divisibility by extracting digits one-by-one. _Bool is_divisible_by_all_digits(int n,int divisor){ _Bool flag=true; while(n>0){ int digit=n%10; if(digit!=0&&digit<=divisor&&(divisor%digit)!=0){ flag=false;break; } n/=10; } return flag; } void test_cases(){ printf("%d ",is_divisible_by_all_digits(7896,4));// Outputs '1' since all non-zero digits divide into four cleanly. printf("%d ",is_divisible_by_all_digits(1012,10)); // Outputs '0'. } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值