1. 程式人生 > 實用技巧 >一步步教你用Prometheus搭建實時監控系統系列(一)——上帝之火,普羅米修斯的崛起

一步步教你用Prometheus搭建實時監控系統系列(一)——上帝之火,普羅米修斯的崛起

給定一個以字串表示的非負整數 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。

解題思路:

  當前一個數字大於後一個數字時,就說明此時的數字不符合。我們得到的字串一定是字首為單調遞增的字串。

// 速度很慢
class Solution {
    public String removeKdigits(String num, int k) {
        Stack<Character> stack = new Stack<>();
        for(char digit : num.toCharArray()) {
        // 判斷當值是否小於棧頂元素 while(!stack.isEmpty() && k > 0 && stack.peek() > digit) { stack.pop(); k--; } if(stack.isEmpty() && digit == '0') continue; stack.push(digit); }
    // 如果字串就是單調遞增的,彈出棧頂k個元素 while(k > 0 && !stack.isEmpty()) { stack.pop(); k--; } if(stack.isEmpty()) { return "0"; } StringBuilder sb = new StringBuilder(); boolean flag = true; while(!stack.isEmpty()) { sb.append(stack.pop()); } return sb.reverse().toString(); } } // 官方題解 class Solution { public String removeKdigits(String num, int k) { LinkedList<Character> stack = new LinkedList<Character>(); for(char digit : num.toCharArray()) { while(stack.size() > 0 && k > 0 && stack.peekLast() > digit) { stack.removeLast(); k -= 1; } stack.addLast(digit); } /* remove the remaining digits from the tail. */ for(int i=0; i<k; ++i) { stack.removeLast(); } // build the final string, while removing the leading zeros. StringBuilder ret = new StringBuilder(); boolean leadingZero = true; for(char digit: stack) { if(leadingZero && digit == '0') continue; leadingZero = false; ret.append(digit); } /* return the final string */ if (ret.length() == 0) return "0"; return ret.toString(); } }

  

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/remove-k-digits
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。