Day2(贪心算法+栈)

给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。

  • num 的长度小于 10002 且 ≥ k。
  • num 不会包含任何前导零
var removeKdigits = function (num, k) {
     
    let stack = []
    for (let it of num) {
     
        //用while不用if,可以依次便利前面的元素
        //这里把前面大于后面的情况放在了保留k时处理
        while (stack.length > 0 && stack[stack.length - 1] > it && k) {
     
            stack.pop()
            k -= 1
        }
        stack.push(it)
    }
    //还保留有k的情况
    for (; k > 0; k--) {
     
        stack.pop()
    }
    //判断是否有前置0
    let res = ''
    let isLendingZero = true
    for (let it of stack) {
     
        if (it == '0' && isLendingZero) {
     
            continue
        }
        isLendingZero = false
        res += it
    }
    //判断是否是空字符串
    return res == '' ? '0' : res
}

给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。

var removeDuplicateLetters = function (s) {
     
    var stack = []
    for (var i = 0; i < s.length; i++) {
     
        var char = s[i]
        if (stack.indexOf(char) > -1) continue
        // 使用indexOf(xx, i)取代 lastIndexOf(xx)减少遍历次数会更快
        //第一个是防止栈里没值了
        //第二个是确保栈里左边要小于右边的
        //第三个是确定it是不是后续还有
        while (stack.length > 0 && stack[stack.length - 1] > char && s.indexOf(stack[stack.length - 1], i) > i) {
     
            stack.pop()
        }
        stack.push(char)
    }
    return stack.join('')
}

Day2(贪心算法+栈)_第1张图片
ε(┬┬﹏┬┬)3

你可能感兴趣的:(#,栈,哈希表,初学数据结构,贪心算法,栈,javascript)