算法46----移除K位數字
阿新 • • 發佈:2018-11-11
一個 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位數字