leetcode402移掉K位数字

leetcode402 Remove K Digits

Posted by BY on May 23, 2019

前言

新的一年,好好学习。

正文

问题来源

本问题来自leetcode上的402题。

问题描述

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

示例 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。

分析:

贪心
其基本思想是利用栈尽量维持一个递增的序列,也就是说将字符串中字符依次入栈,如果当前字符串比栈顶元素小,并且还可以继续删除元素,那么就将栈顶元素删掉,这样可以保证将当前元素加进去一定可以得到一个较小的序列.也可以算是一个贪心思想.最后我们只取前len-k个元素构成一个序列即可,如果这样得到的是一个空串那就手动返回0.还有一个需要注意的是字符串首字符不为0

func removeKdigits(num string, k int) string {
    l := len(num)
    n := k
    stack := make([]byte, 0)
    for i := 0; i < l; i++ {
        for len(stack) != 0 && n > 0 && num[i] < stack[len(stack)-1] {
            stack = stack[:len(stack)-1]
            n--
        }
        stack = append(stack, num[i])
    }
    cnt := 0
    for cnt < len(stack) && stack[cnt] == '0'  {
        cnt++
    }
    fmt.Println(n, len(stack))
    if cnt == len(stack) || cnt == len(stack)-n {
        return "0"
    }
    return string(stack[cnt:len(stack)-n])
}

C++

class Solution {
public:
    string removeKdigits(string num, int k) {
        string ans;
        int n = k, len = num.size(), cnt = 0;
        for(auto val: num)
        {
            while(!ans.empty() && n > 0 && val < ans.back())
            {
                n--;
                ans.pop_back();
            }
            ans.push_back(val);
        }
        while(ans[cnt]=='0') cnt++;
        ans = ans.substr(cnt, len-k-cnt);
        return !ans.size()?"0":ans;
    }
};

总结:

勤思考。

结语

不管怎么样好好加油。