字符串排序
时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte
总提交:1175 测试通过:220
另外如果是按A出现的先后顺序:
还有一种,利用stable_sort函数(与sort区别:相等时不交换顺序)的:
总提交:1175 测试通过:220
描述
有一些A、C、M组成的字符串,将其按字符A排序。
输入
一组测试数据,输入数据由若干行组成,每行是字符A、C或M组成的字符串。
输出
对所有输入的数据,先按字符A的个数进行升序排序,如果字符A的数量相等,再按出现的先后顺序排序,每行输出一个字符串。
样例输入
ACM
MCA
AACAAMMM
AACCMM
CMAAMMMMMM
AAA
样例输出
ACM
MCA
AACCMM
CMAAMMMMMM
AAA
AACAAMMM
题目来源
NUPT
分析:实在大坑。困扰了我一天。
①输入Ctrl+z结束输入。
②如果字符A的数量相等,再按出现的先后顺序排序——是指输入的先后顺序,Not字符串中A出现的顺序,当然后者的要求我也实现了,当然测试是错误的。
③字符串的长度很大很大。。。。。。
#include<iostream>
using namespace std;
#include<string>
//字符串排序
int main()
{
string tmp; int N = 0;
string s[100];
int num[10000] = {0}; // A的个数 下标对应string下标
while(cin>>tmp)
s[N++] = tmp;
for(int i=0;i<N;i++)
{
for(int j=0;j<s[i].length();j++)
if(s[i][j] == 'A')
num[i] ++;
}
for(int t=0;t<10000;t++)
{
for(int i=0;i<N;i++)
if(t == num[i])
cout<<s[i]<<endl;
}
return 0;
}
另外如果是按A出现的先后顺序:
#include<iostream>
using namespace std;
#include<string>
//字符串排序
int main()
{
string tmp; int N = 0;
string s[100];
int num[10000] = {0}; // A的个数 下标对应string下标
//int first[10000] = {0}; // 首次出现A的位置 0对应没A
while(cin>>tmp)
s[N++] = tmp;
for(int i=0;i<N;i++)
{
for(int j=0;j<s[i].length();j++)
if(s[i][j] == 'A')
num[i] ++;
}
for(int i=0;i<N;i++)
{
for(int j=0;j<s[i].length();j++)
if(s[i][j] == 'A')
{
first[i] = j;
break;
}
}
for(int t=0;t<10000;t++) // t——A的个数
{
for(int i=0;i<N;i++)
if(t == num[i])
{
for(int tt=0;tt<10000;tt++) // tt——A的位置
for(int k=0;k<N;k++)
if(num[k] == t && first[k] == tt)
cout<<s[k]<<endl;
break;
}
}
return 0;
}
还有一种,利用stable_sort函数(与sort区别:相等时不交换顺序)的:
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int cmp(string a, string b)
{
int aa = 0, bb = 0;
for(int i=0;i<a.length();i++)
if(a[i] == 'A')
aa ++;
for(int i=0;i<b.length();i++)
if(b[i] == 'A')
bb ++;
if(aa < bb) return 1;
else return 0;
}
int main()
{
string s[1000];
int num = 0;
while(cin>>s[num++]);
stable_sort(s, s+num, cmp); // 相等时不交换顺序
for(int i=0;i<num;i++)
cout<<s[i]<<endl;
return 0;
}