这段代码的目的是从一个十进制正整数 n 中删除 k 位数字,使得生成的新整数最小。具体步骤如下:
-
输入处理:
- 首先读取测试用例的数量 t。
- 对于每个测试用例,读取整数 n 和需要删除的位数 k。
-
将整数转换为数组:
- 将整数 n 转换为字符串,然后将每个字符转换为整数并存入 vector<int> a 中。
-
删除数字以生成最小整数:
- 使用一个迭代器 it 遍历 vector<int> a。
- 在遍历过程中,如果当前数字大于其后面的数字,则删除当前数字,并更新迭代器和 k 的值。
- 如果当前数字不大于其后面的数字,则迭代器不动,实际操作是保证迭代器不失效,先向后移动一位再退回,如果已经是开头的则不退回。这样做是因为删除之后上一个数还要与后面的数字比较,所以迭代器不动。
- 如果遍历到最后一个数字,或者 k 已经为 0,则停止遍历。
- 如果 k 仍然大于 0,则从 vector<int> a 的末尾开始删除数字,直到 k 为 0。
-
输出结果:
- 将 vector<int> a 中的数字拼接成最终的最小整数,并输出。
#include<bits/stdc++.h> using namespace std; int main(){ int t; cin>>t; for(int i=1;i<=t;i++){ string n; cin>>n; vector<int>a; for(char c:n){ a.push_back(c-'0'); } int k; cin>>k; auto it=a.begin(); while(1){ if(k==0) break; if(it==a.end()-1) break; if(*it>*(it+1)){ it=a.erase(it); k--; if(it!=a.begin()) it--; } else{ it++; } } while(k!=0){ a.pop_back(); k--; } for(int c:a){ cout<<c; } cout<<endl; } return 0; }
- 将 vector<int> a 中的数字拼接成最终的最小整数,并输出。