该题的思路是先删除数串中的逆序对,再从后往前删除,去除前导零,即可得到最小值
#include <iostream>
using namespace std;
int main()
{
string num;
int k;
cin >> num >> k;
string res = "0";
for (int i = 0; i < num.size(); i ++ )
{
while (k && num[i] < res.back()) //只要有逆序对且k不为0就删除前面比num[i]大的所有数
{
res.pop_back();
k -- ;
}
res += num[i];
}
while (k -- ) res.pop_back(); //已经不存在逆序对了,但还剩下k,就从后往前删直到k为0
int i = 0;
while (i < res.size() && res[i] == '0') i ++ ; //判断前导零个数
if (i == res.size()) puts("0"); //若整个数串都是0,则输出0
else cout << res.substr(i) << endl; //前i - 1个都是前导零,所以从第i个输出
return 0;
}
一看就会了,%%%
思路明确,一句点破
嘻嘻
好棒哦
num.size()返回值为unsigned,不能直接比较,最好强制转换一下
细啊,记住了
我在这个地方卡了半小时,总是编译错误,百度了才知道这个😂
我看了下api,vector的size()返回值也是 unsigned ,但是我在for循环里面从来没有注意到这个细节?
size(),length()这些的返回值都是unsigned,才是合法的,比较的时候int会隐式转换为unsigned,又因为我们在使用for循环时 i 最小都是从0开始,所以不会有问题。如果i是负数,隐式转换为unsigned后可能会变成一个很大的正数,导致数组越界,报错。
这段代码最终输出 1 ,说明了这个问题。
感谢,懂了,感觉还是要补一补csapp…呜呜
证明一下?
tql
逆序对 好高级的说法=-=
嘻嘻😋