原题:
Given a string, sort it in decreasing order based on the frequency of characters.
Example 1:
Input: "tree" Output: "eert" Explanation: 'e' appears twice while 'r' and 't' both appear once. So 'e' must appear before both 'r' and 't'. Therefore "eetr" is also a valid answer.
Example 2:
Input: "cccaaa" Output: "cccaaa" Explanation: Both 'c' and 'a' appear three times, so "aaaccc" is also a valid answer. Note that "cacaca" is incorrect, as the same characters must be together.
Example 3:
Input: "Aabb" Output: "bbAa" Explanation: "bbaA" is also a valid answer, but "Aabb" is incorrect. Note that 'A' and 'a' are treated as two different characters.
代码如下:
char* frequencySort(char* s) {
int len=strlen(s);
if(len<2)
return s;
struct listnode
{
char sample;
int times;
struct listnode* next;
};
struct listnode* head;
head=(struct listnode*)malloc(sizeof(struct listnode));
head->sample=*s;
head->times=1;
head->next=NULL;
int count=1;
for(int n=1;n<len;n++)
{
struct listnode* p;
p=head;
int flag=0;
while(p!=NULL)
{
if(p->sample==*(s+n))
{
p->times+=1;
flag=1;
break;
}
p=p->next;
}
if(flag==0)
{
p=(struct listnode*)malloc(sizeof(struct listnode));
p->sample=*(s+n);
p->times=1;
p->next=head->next;
head->next=p;
count++;
}
}
int t=1;
while(t==1)
{
t=0;
struct listnode* p;
p=head;
while(p->next!=NULL)
{
if(p->times<p->next->times)
{
t=1;
char tempC=p->sample;
p->sample=p->next->sample;
p->next->sample=tempC;
int tempI=p->times;
p->times=p->next->times;
p->next->times=tempI;
}
p=p->next;
}
}
char* result;
result=(char*)malloc(sizeof(char)*(len+1));
*(result+len)='\0';
int n=0;
while(head!=NULL)
{
int k=head->times;
memset(result+n,(head->sample),sizeof(char)*k);
n+=head->times;
struct listnode* temp;
temp=head;
head=head->next;
free(temp);
}
return result;
}
链表比瞎逼用qsort。。。唉 都是泪。