制作个人免费网站展示设计,网站公众号信息化建设工作计划,凤城网站建设,企业微信小程序登录入口文章目录 题目描述方法一方法二 题目描述
给定一个十进制正整数n(0 n 1000000000)#xff0c;每个数位上数字均不为0。n的位数为m。 现在从m位中删除k位(0k m)#xff0c;求生成的新整数最小为多少#xff1f; 例如: n 9128456, k 2, 则生成的新整数最… 文章目录 题目描述方法一方法二 题目描述
给定一个十进制正整数n(0 n 1000000000)每个数位上数字均不为0。n的位数为m。 现在从m位中删除k位(0k m)求生成的新整数最小为多少 例如: n 9128456, k 2, 则生成的新整数最小为12456
输入 第一行t, 表示有t组数据 接下来t行每一行表示一组测试数据每组测试数据包含两个数字n, k。
输出 t行每行一个数字表示从n中删除k位后得到的最小整数。
输入样例 2 9128456 2 1444 3 输出样例 12456 1
方法一
#includeiostream
using namespace std;
int k;
main()
{int t;cint;while(t--){string n; cinnk;int lenn.size();while(k--)for(int i0;ilen;i) if(n[i]n[i1]||ilen-1) //删除遇到的第一个递减序列的第一个数字(若整个字符串为非递减序列则删去末尾的数字){n.erase(i,1); //把当前字符从字符串中删除break; //不可省略否则字符串会多删字符}while(n[0]0n[1]) //去掉前缀0并至少保留1个数字n.erase(0,1); //删去当前字符串开头的0coutnendl; //输出字符串}
}方法二
#includestdio.h
#includestring.hint main() {int t, k;char a[200];scanf(%d, t); while (t--) { int i, j, l;scanf(%s %d, a, k); int len strlen(a); for (i 0; i k; i) { // 执行 k 次删除操作for (j 0; j len - 1; j) { // 找到第一个逆序对并删除if (a[j] a[j 1]) {for (l j; l len - 1; l) { // 删除逆序对a[l] a[l 1];}break;}}len - 1; // 每删除一个字符字符串长度减一}for (i 0; i strlen(a) - k; i) { // 输出删除后的字符串if (i 0 a[i] 0) { // 如果删除后的字符串以0开头则跳过0continue;}printf(%d, a[i] - 0);}printf(\n);}return 0;
}