LeetCode //C - 402. Remove K Digits

402. Remove K Digits

Given string num representing a non-negative integer num, and an integer k, return the smallest possible integer after removing k digits from num.

Example 1:

Input: num = "1432219", k = 3
Output: "1219"
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.

Example 2:

Input: num = "10200", k = 1
Output: "200"
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.

Example 3:

Input: num = "10", k = 2
Output: "0"
Explanation: Remove all the digits from the number and it is left with nothing which is 0.

Constraints:
  • 1 < = k < = n u m . l e n g t h < = 1 0 5 1 <= k <= num.length <= 10^5 1<=k<=num.length<=105
  • num consists of only digits.
  • num does not have any leading zeros except for the zero itself.

From: LeetCode

Link: 402. Remove K Digits


Solution:

Ideas:

- Stack Approach: The key idea is to use a stack to build the smallest number. If a digit is greater than the next digit, we remove it from the stack to get a smaller result.
- Efficiency: The algorithm runs in linear time, O(n), where n is the length of the input number, making it efficient for large inputs.
- Edge Cases: Properly handles cases where the entire number is removed, or there are leading zeros.

Code:
c 复制代码
char* removeKdigits(char* num, int k) {
    int len = strlen(num);
    
    // If k equals or exceeds the number of digits, the result is 0
    if (k >= len) {
        char* result = (char*)malloc(2);
        result[0] = '0';
        result[1] = '\0';
        return result;
    }

    // Allocate memory for the stack with a length of len + 1 (for null-terminator)
    char* stack = (char*)malloc((len + 1) * sizeof(char));
    int top = 0;  // Index to keep track of the top of the stack

    for (int i = 0; i < len; i++) {
        // While there are characters in the stack, and the current digit is smaller than the stack's top
        // and we still need to remove digits (k > 0), we pop the stack.
        while (top > 0 && k > 0 && stack[top - 1] > num[i]) {
            top--;
            k--;
        }
        // Add the current digit to the stack if it's not a leading zero or the stack is not empty
        if (top > 0 || num[i] != '0') {
            stack[top++] = num[i];
        }
    }

    // If we still need to remove more digits, reduce the size of the stack
    top -= k;

    // If there are no digits left, return "0"
    if (top <= 0) {
        free(stack);
        char* result = (char*)malloc(2);
        result[0] = '0';
        result[1] = '\0';
        return result;
    }

    // Null-terminate the stack and return it as the result
    stack[top] = '\0';

    return stack;
}
相关推荐
find1star2 小时前
LeetCode 141:环形链表
java·算法·leetcode·链表
迅翼SwiftWing3 小时前
编队系列(总)|固定翼编队如何实现稳定飞行?通信架构、协同算法与工程约束深度解析
算法·架构
LB21123 小时前
力扣160 21 86
算法·leetcode·职场和发展
小智老师PMP4 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
HugoStudio_SWAN4 小时前
洛谷 B4450 / B3867 / B3923 智慧购物、储蓄与做题——从程序到生活
c++·学习·程序人生·算法·生活
a187927218314 小时前
【算法】动态规划第二篇:双序列 DP 三课——继承、计步与断链
算法·leetcode·动态规划·dp·回溯·暴力·算法讲解
江畔柳前堤5 小时前
前台·中台·后台:2026年AI原生时代的架构全景图
开发语言·人工智能·算法·机器学习·架构·scala·ai-native
文心快码BaiduComate5 小时前
2026 OPC x AI Coding 趋势案例交流会圆满落幕:一个人就一支研发团队
算法
ACM-moran6 小时前
条件显化(二分单峰函数+构造数列)
算法·推公式·整数三分
闻缺陷则喜何志丹6 小时前
【栈 运算系统】P3719 [AHOI2017初中组] rexp|普及+
c++·算法··洛谷·运算系统