Description
给定一个十进制正整数n(0 < n < 1000000000),每个数位上数字均不为0。n的位数为m。
现在从m位中删除k位(0<k < m),求生成的新整数最小为多少?
例如: n = 9128456, k = 2, 则生成的新整数最小为12456
Input
第一行t, 表示有t组数据;
接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。
Output
t行,每行一个数字,表示从n中删除k位后得到的最小整数。
Sample Input
2 9128456 2 1444 3
Sample Output
12456 1
解法一:
笔者自己想的,有点绕人。
一共是7位删除两位,从第5位开始,如果第6位第七位有比第五位小的就保留,大的就去掉(前提是还没删除到k个)
m位数删除k位,那么下标就从 i=m-k-1开始比较,j从 i+1 位开始如果有比第i位大的数就要去掉,如果循环结束没够k位数组从前往后删除(表现为整数从个位删除)
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main() {
int n,m,k,t;//n数、m位、删除k位、t组数据
scanf("%d",&t);
while(t--) {
m=0;
int data[10];
scanf("%d%d",&n,&k);
while(n!=0) {
data[m++]=n%10;
n/=10;
}
int i,j,ans=0;
for(i=m-k-1; i>=0; i--) {
for(j=i+1; j<m; j++) {
if(data[j]>data[i]&&ans<k) {
data[j]=0;
ans++;
}
if(ans==k)
break;
}
if(ans==k)
break;
}
i=0;
while(ans<k) {
data[i++]=0;
ans++;
}
for(i=m-1; i>=0; i--)
if(data[i]!=0)
n=n*10+data[i];
printf("%d\n",n);
}
return 0;
}
解法二:
易懂、代码简介、原文在这
本文链接:https://blog.csdn.net/jiangjiangjiang6/article/details/104866795
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main() {
int n,m,k,t;//n数、m位、删除k位、t组数据
scanf("%d",&t);
while(t--) {
m=0;
int data[10];
scanf("%d%d",&n,&k);
while(n!=0) {
data[m++]=n%10;
n/=10;
}
int i,j,ans=0;
for(i=m-k-1; i>=0; i--) {
for(j=i+1; j<m; j++) {
if(data[j]>data[i]&&ans<k) {
data[j]=0;
ans++;
}
if(ans==k)
break;
}
if(ans==k)
break;
}
i=0;
while(ans<k) {
data[i++]=0;
ans++;
}
for(i=m-1; i>=0; i--)
if(data[i]!=0)
n=n*10+data[i];
printf("%d\n",n);
}
return 0;
}
//以下是参考答案
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int t, k, m;
char str[20];//数字n ,有m位
cin >> t;
while(t--){
cin >> str >> k;
m = strlen(str);
while(k--)
{
//注意字符串去尾的问题,没有改变字符串长度却能够输出不超过m的str
//是因为此段代码有运行str[m-1] = str[m],将字符串尾覆盖掉了
for(int i = 0; i < m; i++)
if(str[i] > str[i+1])
{
for(int j = i; j < m; j++)
str[j] = str[j+1];
break;
}
m--;
}
cout << str << endl;
}
return 0;
}