Q402 Remove K Digits

Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.

Note:

The length of num is less than 10002 and will be ≥ k.
The given num does not contain any leading zero.

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.
解题思路:

这道题是说,给定的一个字符串数字 num,从中移除 k 个数字,使得最后的数字最小。

不难发现以下的规律:

  1. 如果字符串长度和 k 相等,或者字符串长度为 0,均返回 ‘0’。
  2. 如果 k 为 0,直接返回 num。
  3. 对于 num = “1432219”,k = 3,遍历 num 中的每一个数字,如果前一个数字比后一个数字大,则移除前一个数字,然后将 k 减 1;否则,将 下标 i 往后移动移。如此循环直到 k = 0 为止。因此对于这个例子,num 和 k 先后的值为:
    num = "132219", k = 2 # 4比3大,删除4
    num = "12219", k = 1 # 3比(第一个)2大,删除3
    num = "1219", k = 0 # (第二个)2比(第二个)1大,删除(第二个)2
  4. 对于 num = "124"、"112" 等,k = 1,发现 i = 2 时仍然不能删除,说明前面的数字是递增的(非严格),因此只需要删除后 k 个字符就能得到最终的结果。
  5. 对于 num = "110",k = 2,当下标 i 等于 1 时,(第二个)1 > 0,可以删除 (第二个)1,得到 num = "10",k = 1,并且发现 i 的下标大于 0 ,因此还要将 i 向前移动一个位置(目的是让第一个 1 与 0)比较。
  6. 最后,如果得到的结果有前导0,要删除。

注:此题有很多边界情况,要综合考虑各种情况。

Python 实现:
class Solution:
    def removeKdigits(self, num, k):
        """
        :type num: str
        :type k: int
        :rtype: str
        """
        lens = len(num)
        if lens == 0 or lens == k:
            return '0'
        if k == 0:
            return num
        i = 0
        while i < len(num) - 1 and k > 0:
            if num[i] > num[i+1]:
                num = num[:i] + num[i+1:]
                k -= 1
                if i > 0:  # "110"
                    i -= 1   
            else:
                i += 1
        if k > 0:  # 删除末尾k个数字
            num = num[:len(num)-k]
        while len(num) > 1 and num[0] == '0':  # 删除前导0
            num = num[1:]
        return num

print(Solution().removeKdigits("1432219", 3))  # 1219
print(Solution().removeKdigits("10200", 1))  # 200
print(Solution().removeKdigits("10", 2))  # 0
print(Solution().removeKdigits("112", 2))  # 1
print(Solution().removeKdigits("110", 2))  # 0
print(Solution().removeKdigits("996414", 2))  # 6414
print(Solution().removeKdigits("12345", 2))  # 123
print(Solution().removeKdigits("12354", 1))  # 1234

你可能感兴趣的:(Q402 Remove K Digits)