leetcode 451. Sort Characters By Frequency

原题:

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。。。唉 都是泪。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值