题目::
如果统计的个数相同,则按照ASII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
实现以下接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。
这个题目为难了我好久,因为不知道怎么对重复字符进行排序,后来想了一个办法就是把重复字符去掉,不过增加了空间复杂度。虽然分数不高,不过能AC就很高兴了。
这个题目主要是如果对输入的字符串进行处理,将非法字符除去掉,我这里用得是Hsh和结构体相结合来处理的,先用hash来存储每个字符的个数,然后通过sort的排序功能,对他们进行排序。再取出想要的字符。
在sort的第三个参数中定义::::如果个数不同,返回是s[i].num>s[j].num;如果个数相同,返回s[i].p<s[j].pP为字符,num为个数 。就很好理解了。
<span style="font-size:18px;">#include <iostream>
#include <string>
#include<algorithm>
const int maxn = 1000;
const int TableSize = 256;
using namespace std;
int FindCharNumber(char *str,char str1)
{
unsigned int hashTable[TableSize];
int i;
for(i = 0; i < TableSize; i++)
hashTable[i] = 0;
char *HashKey = str;
int j;
int len=strlen(str);
while(*HashKey)
{
for(j=0;j<len;j++)
{
if(((int)*HashKey>='0'&&(int)*HashKey<='9')||(((int)*HashKey)>='A'&&(int)*HashKey<='Z')||(int)*HashKey==' '||(((int)*HashKey)>='a'&&(int)*HashKey<='z'))
{
hashTable[*HashKey]++;
}
HashKey++;
}
}
for(i = 0; i < len; i++)
{
if(str[i]==str1)
{
return hashTable[str[i]];
}
}
}
struct node
{
char p;
int num;
}s[maxn],s1[maxn],s2[maxn];
bool tcmp(node x,node y)
{
if(x.num!=y.num)
return x.num>y.num;
else
return (int)x.p<(int)y.p;
}
int main()
{
char str[maxn];
cin.getline(str,maxn);
int k=0;
int i=0;
while(str[i])
{
s[k].p=str[i];
s[k].num=FindCharNumber(str,str[i]);
i++;
k++;
}
int len=strlen(str);
sort(s,s+len,tcmp);
/* for(i=0;i<len;i++)
{
cout<<s[i].num;
}*/
int t=0;
for(i=0;i<len;i++)
{
if(s[i].num!=0)
{
s1[t].num=s[i].num;
s1[t].p=s[i].p;
t++;
}
}
/* cout<<"\n";
for(i=0;i<t;i++)
{
cout<<s[i].num;
}
cout<<"\n";*/
int j=1;
for(i=0;i<t;i++)
{
s2[0].num=s1[0].num;
s2[0].p=s1[0].p;
if(s1[i].p!=s1[i+1].p)
{
s2[j].num=s1[i+1].num;
s2[j].p=s1[i+1].p;
j++;
}
}
for(i=0;i<j-1;i++)
{
cout<<s2[i].p;
}
return 0;
}</span>