Welcome to Subscribe On Youtube

402. Remove K Digits

Description

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.

Solutions

Solution 1: Greedy Algorithm

  • class Solution {
        public String removeKdigits(String num, int k) {
            StringBuilder stk = new StringBuilder();
            for (char c : num.toCharArray()) {
                while (k > 0 && stk.length() > 0 && stk.charAt(stk.length() - 1) > c) {
                    stk.deleteCharAt(stk.length() - 1);
                    --k;
                }
                stk.append(c);
            }
            for (; k > 0; --k) {
                stk.deleteCharAt(stk.length() - 1);
            }
            int i = 0;
            for (; i < stk.length() && stk.charAt(i) == '0'; ++i) {
            }
            String ans = stk.substring(i);
            return "".equals(ans) ? "0" : ans;
        }
    }
    
  • class Solution {
    public:
        string removeKdigits(string num, int k) {
            string stk;
            for (char& c : num) {
                while (k && stk.size() && stk.back() > c) {
                    stk.pop_back();
                    --k;
                }
                stk += c;
            }
            while (k--) {
                stk.pop_back();
            }
            int i = 0;
            for (; i < stk.size() && stk[i] == '0'; ++i) {
            }
            string ans = stk.substr(i);
            return ans == "" ? "0" : ans;
        }
    };
    
  • class Solution:
        def removeKdigits(self, num: str, k: int) -> str:
            stk = []
            remain = len(num) - k
            for c in num:
                while k and stk and stk[-1] > c:
                    stk.pop()
                    k -= 1
                stk.append(c)
            return ''.join(stk[:remain]).lstrip('0') or '0'
    
    
  • func removeKdigits(num string, k int) string {
    	stk, remain := make([]byte, 0), len(num)-k
    	for i := 0; i < len(num); i++ {
    		n := len(stk)
    		for k > 0 && n > 0 && stk[n-1] > num[i] {
    			stk = stk[:n-1]
    			n, k = n-1, k-1
    		}
    		stk = append(stk, num[i])
    	}
    
    	for i := 0; i < len(stk) && i < remain; i++ {
    		if stk[i] != '0' {
    			return string(stk[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';
    }
    
    

All Problems

All Solutions