輸入一串字串,由小到大輸出各字元出現的頻率,若相同則ASCII大者放前面

[心得]

1.思考很亂,最後參考sagit大的想法,若出現過則break,沒出現則新增

2.掃過一次之後再檢查頻率,若小於前面出現過的字元或相等但ASCII較大則交換位置

2. if(cnt>0) printf("\n"); 擺放的位置超怪,沒想到要這樣才能過,卡題了很久 = ="

 

#include <stdio.h>
#include <string.h>

void swap(int *i,int *j)
{
    int temp;
   
    temp=*i;
    *i=*j;
    *j=temp;
    
}

int main()
{
    char input[1002];
    int cnt=0;
       
    while(gets(input)!=NULL)
    {  
        int freq[128]={0};
        int sort[128]={0};
        int len,i,j,k;
        int n=0;
        
        if(cnt>0) printf("\n");
                       
        len=strlen(input);
       
        for(i=0;i<len;i++)
        {
            for(j=0;j<n;j++) /* check redundant */
                if((sort[j]==input[i])) break;
               
            if(j<n) freq[j]++;
            /* first appearance */
            else
            {
                sort[n]=input[i];
                freq[n]=1;
                n++;
            }
        }
       
        for(i=0;i<n;i++)
        {
            for(j=i+1,k=i;j<n;j++)
                if((freq[j]<freq[k])||((freq[j]==freq[k])&&(sort[j]>sort[k]))) k=j;
               
            if(k!=i)
            {
                swap(&freq[i],&freq[k]);
                swap(&sort[i],&sort[k]);
            }
            printf("%d %d\n",sort[i],freq[i]);
        }
        cnt++;
       
    }
   
    return 0;
}

arrow
arrow
    全站熱搜

    RingsACM 發表在 痞客邦 留言(0) 人氣()