今天在牛客网刷题遇到数串问题:
刚开始自己思路是取出每个数的第一位存入num_head数组,用log10()函数求出每个数的位数存入len数组(最后合成最大数时作为10的幂),依次找到num_head中最大到最小的数,以此来判断每个数的大小。这种方法很麻烦,且遇到首位数相同的数,需要继续判断后面的数,效率非常低。看了大神的代码,发现自己对于C++的掌握还停留在非常低的水平,对于很多库函数了解的太少了。下面贴上代码:
#include <vector>
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int main()
{
vector<string> sArray;
string s;
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> s;
sArray.push_back(s);
}
sort(sArray.begin(), sArray.end(), [](string s1, string s2) //也可以自己写个排序函数
{return (s1 + s2) > (s2 + s1); });
for (auto s : sArray)
cout << s;
return 0;
}
结果如下:
C++11自带的sort函数,可对字符串进行排序。整道题采用字符串形式,合成字符串的时候只需将各个字符串相加就醒了,极大的提高了合成最大数时的效率,而数值型还需要考虑其他数是多少位才能乘以对应的倍数,非常麻烦。也可以自己写个排序函数,效果和sort函数一样,例如:
for (int i = 0; i < n-1; i++)//把字符串从大到小排序
{
if (sArray[i] < sArray[i + 1])
{
s = sArray[i];
sArray[i] = sArray[i + 1];
sArray[i + 1] = s;
}
}