用c语言来解决力扣第402题
时间: 2024-10-26 18:16:45 浏览: 39
在LeetCode第402题“Remove K Digits”中,你需要从一个非负整数的数组(表示为字符串形式)中移除k个数字,使得剩下的数字按顺序组成最小的非负整数。这里是一个简单的C语言解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Function to find the minimum number after removing k digits
char* removeKdigits(char* num, int k) {
int n = strlen(num);
if (k >= n) return "";
// Initialize a stack for storing indices
int minStack[5] = {n}, top = 0;
for (int i = 0; i < n; ++i) {
while (top > 0 && num[i] < num[minStack[top - 1]]) {
// Remove digit at index minStack[top - 1]
num[minStack[top - 1]] = '\0';
--minStack[top--];
}
// Push current index onto the stack if not full and still need to remove more digits
if (k > 0 && num[i] != '0') {
minStack[++top] = i;
--k;
}
}
// If all k digits removed or reached the beginning of the number
if (k == 0) {
num[minStack[0]] = '\0'; // Convert it back to an integer
return num;
} else {
// Fill in the remaining positions with zeros
memmove(num + 1, num + minStack[0] + 1, n - minStack[0]);
num[0] = '0'; // Add a zero at the beginning
return num;
}
}
int main() {
char* num = "1432219";
int k = 3;
char* result = removeKdigits(num, k);
printf("Minimum number after removing %d digits: %s\n", k, result);
free(result); // Don't forget to free the dynamically allocated memory
return 0;
}
```
在这个程序中,我们维护了一个栈,用于保存需要删除的小数字的索引。遍历输入字符串,每次遇到比栈顶元素小的数字,就将其后面的数字依次向前移动并删除。同时检查是否还有剩余的k值,如果有的话,继续将当前数字入栈。最后,根据剩余的k值处理结果。
阅读全文