• 402. Remove K Digits


    package LeetCode_402
    
    import java.util.*
    
    /**
     * 402. Remove K Digits
     * https://leetcode.com/problems/remove-k-digits/description/
     *
     * 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.
     * */
    class Solution {
        /*
        * solution: Stack, scan each number, check current num if large than then the first one in stack,
        * pop the large one, keep some small numbers in stack;
        * Time complexity:O(n), Space complexity:O(n)
        * */
        fun removeKdigits(num: String, k: Int): String {
            var k_ = k
            val stack = Stack<Int>()
            for (c in num) {
                //change into digits
                val n = c - '0'
                while (k_ > 0 && stack.isNotEmpty() && stack.peek() > n) {
                    //pop the large one, keep some small numbers in stack
                    stack.pop()
                    k_--
                }
                stack.push(n)
            }
            //handle case some case, for example 1111
            while (k_ > 0) {
                stack.pop()
                k_--
            }
            //construct the result from the stack
            val sb = StringBuilder()
            while (stack.isNotEmpty()) {
                sb.append(stack.pop())
            }
            sb.reverse()
            //remove leading zero, if sb=="0", no need to remove
            while (sb.length > 1 && sb[0] == '0') {
                sb.deleteCharAt(0)
            }
            return sb.toString()
        }
    }
  • 相关阅读:
    位运算与乘除运算的对照实验
    【字符串处理算法】字符串包括的算法设计及C代码实现
    语音识别及其应用出现“井喷式”发展
    UVA 10888
    SDUT 1500-Message Flood(set)
    string字符串常量池在内存中的位置
    6、jeecg 笔记之 自定义excel 模板导出(一)
    5、jeecg 笔记之 minidao 条件判断
    4、jeecg 笔记之 自定义显示按钮 (exp 属性)
    3、jeecg 笔记之 模糊查询
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/13771912.html
Copyright © 2020-2023  润新知