【每日刷题】Day68
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
1. 451. 根据字符出现频率排序 - 力扣(LeetCode)
2. 最小的K个数_牛客题霸_牛客网 (nowcoder.com)
3. 442. 数组中重复的数据 - 力扣(LeetCode)
1. 451. 根据字符出现频率排序 - 力扣(LeetCode)
//思路:记数排序。
char * frequencySort(char * s)
{
int* hash = (int*)calloc(124,sizeof(int));
for(int i = 0;i<strlen(s);i++)
{
hash[s[i]]+=1;//记录字符出现的次数
}
char* ans = (char*)malloc(sizeof(char)*(strlen(s)+1 ));
int count = 0;
while(count<strlen(s))
{
int max = 0;
for(int i = 0;i<124;i++)
{
if(hash[i]>hash[max])//找到出现次数最多的先放进数组中
max = i;
}
while(hash[max])
{
ans[count++] = max;
hash[max]--;
}
}
ans[count] = '\0';
return ans;
}
2. 最小的K个数_牛客题霸_牛客网 (nowcoder.com)
//TopK问题。思路:堆排序。建立小堆,通过与堆底数据交换的方式将最小的K个数换到堆底。
void Swap(int* x,int* y)
{
int tmp = *x;
*x = *y;
*y = tmp;
}
//向下调整建小堆void AdjustDown(int* arr,int parents,int size)
{
int child = parents*2+1;
while(child<size)
{
if(child+1<size&&arr[child+1]<arr[child])
child++;
if(arr[child]<arr[parents])
Swap(&arr[child],&arr[parents]);
else
break;
parents = child;
child = parents*2+1;
}
}
void HeapSort(int* arr,int size,int k)
{
for(int i = (size-2)/2;i>=0;i--)
{
//向下调整建小堆
AdjustDown(arr, i, size);
}
while(k)
{
Swap(&arr[0],&arr[size-1]);//将堆顶(最小的数)与堆底(最大的数交换)
size--;
k--;
AdjustDown(arr, 0, size);
}
}
int* GetLeastNumbers_Solution(int* input, int inputLen, int k, int* returnSize )
{
int* ans = (int*)malloc(sizeof(int)*(k+1));
int count = 0;
HeapSort(input,inputLen,k);
for(int i = inputLen-1;i>=inputLen-k;i--)
{
ans[count++] = input[i];//取数组后K个数,即为最小的K个数
}
*returnSize = count;
return ans;
}
3. 442. 数组中重复的数据 - 力扣(LeetCode)
//思路:哈希表。
int* findDuplicates(int* nums, int numsSize, int* returnSize)
{
int hash[100001] = {0};
for(int i = 0;i<numsSize;i++)
{
hash[nums[i]]+=1;
}
int* ans = (int*)malloc(sizeof(int)*50001);
int count = 0;
for(int i = 0;i<100001;i++)
{
if(hash[i]==2)
ans[count++] = i;
}
*returnSize = count;
return ans;
}