移掉K位数字

  • Post author:
  • Post category:其他


题目描述

给定一个以字符串表示的非负整数

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。

思路

单调栈,这里是单调递增栈,不符合建栈条件的数移除,直到移除k个数,若单调栈建完了还没有移够K个数,则从栈尾开始移除,因为此时栈尾的数最大,直到移够K个数,注意最后的结果开头可能是0,移除结果开头所有的0.

实现

string removeKdigits(string num, int k) {
	stack<char> data;

	for (int i = 0; i < num.length(); i++)
	{
		if (data.empty())
		{
			data.push(num[i]);
		} else {
			while (!data.empty() && num[i] < data.top())
			{
				if (k == 0)
				{
					break;
				}
				data.pop();
				k--;
			}

			data.push(num[i]);
			
		}
	}

	string res;
	while (!data.empty())
	{
		res += data.top();
		data.pop();
	}
	reverse(res.begin(), res.end());

	int index = 0;
	while (res.length() > 0 && res[index] == '0') {
		index++;
	}

	res = res.substr(index);

	if (k <= res.length())
	{
		res = res.substr(0, res.length() - k);
	}
    
    if (res.length() == 0)
	{
		res = "0";
	}

	return res;
}



版权声明:本文为qican_7原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。