目录
一、题目
二、题目分析
(一)明确需求
背景知识:字符串的比较与连接
1.字符串的比较
2.字符串的连接
(二)分析思路
三、将思路转换为程序
四、总结
一、题目
给定n个正整数a1,a2,……,an对这n个数进行排列,求组合后可以得到的最大数是多少。
输入描述:
第一行输入一个正整数n(1<= n <=20)
第二行为这n个数输出描述:
输出一行表示最大的数
如:
3
13 312 343输出
34331213
二、题目分析
(一)明确需求
题目需要我们通过输入的n个正整数进行组合比较,求出可以得到的最大数。其中有如下几个需要注意的点:
1.输入的正整数个数未知,需要根据接收得到。
2.正整数比较方式并非常规的数值比较,而是类似字符串形式的一个字符一个字符进行比较。
3.我们必须通过字符串连接操作才能对输入的正整数进行组合操作。
综上,我们可以看出:虽然题目表面上说的是对正整数进行操作,但是实际上使用的是字符串结构。
背景知识:字符串的比较与连接
1.字符串的比较
两个字符串进行比较的方式与两个数值进行比较的方式是不同的。当我们需要对两个字符串进行比较时,我们应该知道它们其实是通过一个一个的字符来进行比较的。举一个例子:
当我们要对字符串“11”和字符串“12”进行比较时,其比较过程是这样的:
首先字符串“11”中的第一位字符‘1’和字符串“12”中的第一位字符‘1’进行比较,相同;然后字符串“11”中的第二位字符‘1’和字符串“12”中的第二位字符‘2’进行比较,小于,所以字符串“11”小于字符串“12”。
在这个例子中或许要让看不出字符串比较与数值比较的差别所在,但当我们比较字符串“21”和字符串“112”这种情况发现,字符串“21”是大于字符串“112”的。
那这个定义,我们应该如何使用调试运行来验证呢?
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1;
string str2;
cin >> str1 >> str2;
if (str1 > str2)
{
cout << "大于";
}
return 0;
}
通过测试可以得出,字符串确实是一位一位字符进行比较的。
2.字符串的连接
我们应该如何实现字符串的连接呢?使用’+‘运算符。
//对字符串进行连接
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1;
string str2;
cin >> str1 >> str2;
string str3 = str1 + str2;
cout << str3 << endl;
return 0;
}
(二)分析思路
解决这题,我们可以使用插入排序+字符串连接的方式实现。即对字符串组合进行连接排序,从而选出最大的结果。关于插入排序的思路,我之前的一篇博客已经进行了详细的讲解。
每天学习一个基础算法之插入排序-CSDN博客
三、将思路转换为程序
因为本题大量使用字符串操作,而C语言中没有对字符串进行定义吗,所以为了方便本次只采用C++代码作为示例。
//插入排序+字符串连接
#include <iostream>
#include <string>
using namespace std;
int main()
{
int i = 0;
cin >> i;
string arr[20];//数字字符串化的思路 目的:方便后期连接
cin >> arr[0];
string str;
int x;
for (x = 1; x < i; x++)
{
cin >> str;
int y;
for (y = x - 1; y > -1; y--)
{
if (arr[y] + str >= str + arr[y])//字符串连接后比较
{
arr[y + 1] = str;//字符串比较 进行字符串类似“递增”式的排序
break;
}
else
{
arr[y + 1] = arr[y];
}
}
//此时存在两种情况:1、break跳出(str已经找到合适的位置) 2、循环结束跳出(str要放在开头)
//1时arr[0]要保持不变,2时要用str替换arr[0]
if (y == -1)
{
arr[0] = str;
}
}
//将已经排行字符串数组连接成一个字符串
str = arr[0];
int z;
for (z = 1; z < i; z++)
{
str += arr[z];
}
cout << str << endl;
return 0;
}
四、总结
经过了本题的训练相信大家对字符串操作已经有了较为完美的理解,同时相信大家对插入排序的运用也变得更加熟练了吧!(希望不是博主的一厢情愿)
每日一题,让今天的自己变成更好的自己。
如果觉得博主写得不错就点点赞和收藏吧!如果期待博主的下一篇博客可以给博主点点关注。
如有问题可随时斧正,如有疑惑可随时讨论。