1038 Recover the Smallest Number (详解,技巧,另类的比较大小)

目录

题目

测试样例

输入样例

输出样例

提交结果截图

算法描述

带详细注释的源代码


题目

 题目链接:

1038 Recover the Smallest Number icon-default.png?t=L892https://pintia.cn/problem-sets/994805342720868352/problems/994805449625288704

测试样例

输入样例

5 32 321 3214 0229 87

输出样例

22932132143287

提交结果截图

算法描述

一、我的思路(已AC)

我的想法是,比较两个数哪个在前哪个在后时,

(1)若两个数存在相同位不同时,如1234 和132 前者第二位比后者第二位小,故1234 < 132

(1)若两个数不存在相同位不同时,如1234 和123,仔细看这两个数,明显123放在前面更好,为什么呢?因为1234的第4位 ‘4’ 比123第1位要大,故1234在高位时则更大。根据这个分析,我写出了cmp()函数,具体见源代码部分,有详细注释。

二、最简单的思路

我做完后搜索了一下其他人的代码,发现基本上都是同一种做法,比较两个数(string类型)a和b时,直接比较a + b和b + a(string类型拼接)即可,若a + b < b + a(string类型直接可以判断),则a在前,反之则b在前,方法很简单。

带详细注释的源代码

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

bool cmp(string a, string b)
{
	int i = 0, j = 0;
	//cout << "a = " << a << ", b = " << b << endl;
	while (i < a.length() && j < b.length())//检查相同位是否有不同
	{
		if (a[i] != b[i])//若发现有不同,这可以判断了,如 123 < 1323
			return a[i] < b[i];
		else
			i++, j++;
	}
	if (i != a.length())//若a更长且a的前部分与b相等
	{
		while (a[i] == a[0] && i != a.length())//若a的第j为位为与第一位一样,则j往后
			i++;
		if (a[i] < a[0])//若是比第一位小,则说明放前面更好
			return true;
		else
			return false;
	}
	else//反之,若b更长且b的前部分与a相等
	{
		while (b[j] == b[0] && j != b.length())//若b的第j位与第一位一样,则j往后
			j++;
		if (b[j] < b[0])//若是比第一位小,则说明放前面更好
			return false;
		else
			return true;
	}

}

int main()
{
	int n;
	string tmp, res;
	vector<string>num;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> tmp;
		num.push_back(tmp);
	}
	sort(num.begin(), num.end(), cmp);
	res = num[0];
	for (int i = 1; i < num.size(); i++)
		res = res + num[i];
	while (res[0] == '0' && res.length() != 1)
		res = res.substr(1);//删掉第一位的0
	cout << res << endl;
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值