2025年9月29日 星期一

[451] Sort Characters By Frequency

算是偷吃步的一個方法(嗎)
寫的有一點醜因為一開始以為只有小寫字母
後來發現有大寫字母
再後來發現有數字嗎!
難怪別人都直接128的array 給它開下去Orz
修正版應該就是改成array 128吧但是現在有點忙啊XD

struct map {
int freq ;
char target ;
};

int comp(const void *a, const void *b)
{
struct map *m1 = *(struct map**)a;
struct map *m2= *(struct map**)b;
return (m2->freq - m1->freq);
}

char* frequencySort(char* s) {
struct map **array = calloc (62, sizeof(struct map*));
int len = strlen(s);
int i=0, j=0;
for (; i< 26; i++)
{
array[i]= calloc (1, sizeof (struct map));
array[i]->target = i+ 'a';
}
for (; i< 52; i++)
{
array[i]= calloc (1, sizeof (struct map));
array[i]->target = i-26 + 'A';
}
for (; i< 62; i++)
{
array[i]= calloc (1, sizeof (struct map));
array[i]->target = i-52 + '0';
}
for (int i=0; i< len; i++)
{
int idx = s[i]-'a';
if(idx <0)
{
if (s[i]-'A' < 0)
idx = s[i]-'0'+52;
else
idx = s[i]-'A'+26;
}
// array[idx]->target = s[i];
array[idx]->freq ++;
}

qsort((void *)array, 62, sizeof(struct map *),comp);
i = 0;
while(i<len)
{
while (array[j]->freq > 0)
{
s[i++] = array[j]->target;
(array[j]->freq)--;
}
j++;
}

return s;
}

沒有留言:

張貼留言