PC端、移動端H5資料埋點JSSDK
阿新 • • 發佈:2020-07-23
給定一個以字串表示的非負整數 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 著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。