J 安达的数字手术

这篇文章讨论了如何从给定的数字字符串中移除一个字符,以使剩余部分形成最小的数字。策略是找到第一个不连续的数字并删除它。作者给出了一个C++代码示例来处理这个问题,包括对特殊情况进行处理,如n=1和连续0的情况。
摘要由CSDN通过智能技术生成

题目描述

给你一个长度为 的以字符串表示的非负整数 ,移除这个数中的 位数字,使得剩下的数字最小。请 你以字符串形式返回这个最小的数字。 如果所有数字都被移除则输出 如果删除的数字是第一位,但第二位是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;
}

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平烦..

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值