题目描述
给你一个长度为 的以字符串表示的非负整数 ,移除这个数中的 位数字,使得剩下的数字最小。请 你以字符串形式返回这个最小的数字。 如果所有数字都被移除则输出 如果删除的数字是第一位,但第二位是0,则结果把第二位0去掉,即结果不含前导0 如9011,答案为11
输入格式
第一行表示字符串长度n
第二行表示长度为n的数字字符串
样例输入 #1
5
29833
样例输出 #1
2833
样例输入 #2
1
9
样例输出 #2
0
数据范围与约定
数据保证 1<=n<=1e6,num仅由若干位数字(0 - 9)组成且除本身外, num不含任何前导零。
题干分析
整体思路
要从一串数字中删除一个,使得结果的数最小,怎样实现这个效果?
本蒟蒻发现,当数据是
①严格升序时(如12345),删除最后一个(5)即可。
②严格降序是(如54321),删除第一个(5)即可。
③升序插入一个意外(123645),删除后分别为:23645、13645、12645、12345、12365、12364。显然12345最小。
④降序插入意外(543621),显然43621最小。
总结:找到第一个str[i]>str[i+1]即可,删除str[i]就是正确答案了。
细节处理
①n=1;特殊情况,防止越界,单独处理吧。
②除0操作。使用if判断str[i]=0吗?
③输入的数为10000这类。在②中if语句中可以加一个i!=n-1,让最后一个0保留下来。
看代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
string str1,str2;
cin >>n>> str1;
if (n == 1) str2 = '0';//特殊处理n==1,因为必定为0
else
{
for (int i = 0; i < n - 1; i++)
{
if (str1[i] > str1[i + 1])//核心判断,除去哪个数字自己看看为啥,多列几个数试试
{
str2 = str1.substr(0, i) + str1.substr(i + 1);//STL函数substr()自己去搜
break;//找到了可以直接退出
}
}
for (int i = 0; i < n; i++)
{
if (str2[i] == '0' && i != n - 1)//如果一直为0且不是最后一个数字,继续循环
continue;
str2 = str2.substr(i - 1);
break;
}
}
cout << str2;
return 0;
}