1. 程式人生 > >算法46----移除K位數字

算法46----移除K位數字

一個 type 就是 digi n) ack strong 新的 輸入

一、題目:移除K位數字

給定一個以字符串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。

註意:

  • num 的長度小於 10002 且 ≥ k。
  • num 不會包含任何前導零。

示例 1 :

輸入: num = "1432219", k = 3
輸出: "1219"
解釋: 移除掉三個數字 4, 3, 和 2 形成一個新的最小的數字 1219。

示例 2 :

輸入: num = "10200", k = 1
輸出: "200"
解釋: 移掉首位的 1 剩下的數字為 200. 註意輸出不能有任何前導零。

示例 3 :

輸入: num = "10", k = 2
輸出: "0"
解釋: 從原數字移除所有的數字,剩余為空就是0。

思路1:

采用一個棧:若棧最後一個元素比num中當前元素大,則存入棧中,否則將棧中最後一個元素刪除。當K==0時停止。

代碼1:

    def removeKdigits(self, num, k):
        """
        :type num: str
        :type k: int
        :rtype: str
        """
        #采用棧
        if not num:
            return None
        if k == 0:
            return num
        
        stack 
=[] res = "" for n in num: while k>0 and stack and int(stack[-1]) > int(n): k -= 1 stack.pop() if n.isdigit(): stack.append(n) print(stack) res = "".join(stack) if k>0: m
= len(stack)-k res = "".join(stack[:m]) print(res) return str(int(res)) if res else "0"

思路2:

若num前一個元素比後一個元素大,則刪除。直到k==0

代碼2:

    def removeKdigits(self, num, k):
        if k>len(num)-1:
            return "0"
        i = 0
        while i< len(num)-1 and k>0:
            if int(num[i]) > int(num[i+1]):
                num = num[:i]+num[i+1:]
                if i>0:
                    i-=1
                k-=1
            else:
                i+=1
        num = num[:len(num)-k]
        return str(int(num))

算法46----移除K位數字