给定一个以字符串表示的非负整数 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。
首先从头到尾遍历一遍,当前一个大于后一个的时候,将前一个干掉。这里有一个问题,例如输入999321、2,那么按照上述的说法,那么首先9大于3干掉9,在判断3大于2干掉3,输出9921,这明显有问题的。应该是首先9大于3干掉9,在判断9大于2干掉9,输出9321。这个才是对的。
其他就没什么要注意的了,以下AC解;时间复杂度在O(N),空间为O(1)
class Solution {
public:
string removeKdigits(string num, int k) {
if (k == num.size())
return "0";
num.insert(num.begin(), '0');
while (k != 0)
{
// 从前向后扫描一遍
for (int i = 0; i < num.size() - 1; i++)
{
if (k == 0)
break;
if (num[i]>num[i + 1])
{
num.erase(i, 1);
i=i-2;
k--;
}
}
// 从后向前扫描一遍
for (int i = num.size() - 1; i >0 ; i--)
{
if (k == 0)
break;
if (num[i] >= num[i - 1])
{
num.erase(i, 1);
i++;
k--;
}
}
}
// 把最开始的0全部给去掉
for (int i = 0; i < num.size() - 1; i++)
{
if (num[i] - 48 == 0)
{
num.erase(i,1);
i--;
}
else
break;
}
return num;
}
};