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 <= num.length <= 105
num
consists of only digits.num
does not have any leading zeros except for the zero itself.
Approach 1: Greedy Algorithm
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
stack, remain = [], len(num)-k
for value in num:
while k and stack and stack[-1] > value:
k = k-1
stack.pop()
stack.append(value)
return "".join(stack[:remain]).lstrip('0') or '0'
func removeKdigits(num string, k int) string {
stack, remain := make([]byte, 0), len(num)-k
for i := 0; i < len(num); i++ {
n := len(stack)
for k > 0 && n > 0 && stack[n-1] > num[i] {
stack = stack[:n-1]
n, k = n-1, k-1
}
stack = append(stack, num[i])
}
for i := 0; i < len(stack) && i < remain; i++ {
if stack[i] != '0' {
return string(stack[i:remain])
}
}
return "0"
}
function removeKdigits(num: string, k: number): string {
let nums = [...num];
while (k > 0) {
let idx = 0;
while (idx < nums.length - 1 && nums[idx + 1] >= nums[idx]) {
idx++;
}
nums.splice(idx, 1);
k--;
}
return nums.join('').replace(/^0*/g, '') || '0';
}