我正在解决一个问题,QuestionsLink ,我们得到一个名字和一个整数。您必须打印三个具有最大整数值的名称。
因此,我将数字转换为字符串并将其连接在名称之前。排序后,我得到了想要的结果。但它失败了一些测试用例,这让我对 c++ 中的排序函数如何工作感到好奇。
这是我的代码:
#include <bits/stdc++.h>
#define ll long long int
using namespace std;
int main() {
ll n;
cin >> n;
string names[n];
int arr[n], digits[n];
for (int i = 0; i < n; i++) {
cin >> names[i] >> arr[i];
names[i] = to_string(arr[i]) + names[i];
}
for (int i = 0; i < n; i++) {
digits[i] = floor(log10(arr[i]) + 1);
}
sort(names, names + n, greater<string>());
for (int i = 0; i < n; i++) {
cout << names[i] << endl;
}
/*for(int i=0;i<3;i++){
string s = names[i].substr(digits[i],names[i].length());
cout<<s<<endl;
}
cout<<digits[98];
*/
return 0;
}
测试用例:
9huDmy
995YnAYoAEE
990RUTM
96ipORo
956LNjFa
因此,在按降序排序后,9huDmy 如何在顶部,而接下来的两个则根据它们前面的数字进行排序。
最佳答案
因为greater<string>
根据 ASCII 值将数字排序为小于字符。
你一开始就不应该把它们串联起来。
1) 使用std::pair< int, std::string >
对整数和字符串进行分组。
2) 使用std::vector< std::pair< int, std::string > >
,而不是 C 数组。
3) 编写一个比较器仿函数(或 lambda),根据它们的 int 值对对进行排序。比较 std::pair
自动比较他们的.first
元素,即你的整数值。
4) 使用详细 std::
, 或 using std::string
等等,而不是 using namespace ...
,因为您的全局命名空间会很快变得非常拥挤。
关于c++ - 在对字符串进行排序时在 C++ 中使用 sort(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60365956/