对于一个数组,想要知道这个数组中每一个数字出现的次数,并将每一个数字出现的次数以数组的形式记录下来。以数组arr为例,可以创建一个新的、和arr数组等长的数组tmp(因为数组中的每一个数字都可能只出现一次),然后分别让tmp[arr[i]]++(这里arr[i]后面一般要减一,但没有必要,在解题过程中前后能对应即可),这时tmp数组中下标为k的那一位上记录的就是数字k出现的次数了。(很简单,不要想复杂了)
1,448. 找到所有数组中消失的数字 - 力扣(LeetCode) (leetcode-cn.com)
之前做过一道类似的题,但是那道题的数组中只缺少了一个数字,可以将整个数组的所有数字全部加起来,另外把1到n的每一个数字也加起来,两个和相减的差值就是缺少的那个数字。但是这道题不一样,这道题缺少的数字可能有很多个。因此想要求解本题,需要额外创建一个数组,将原数组中出现的每一个数字(如一个值为K的数字)存放到新创建的数组的第K个位置上去,这样再遍历一遍新创建的数组,就可以找到缺少的值。(和最开始刷题时字符串组成的数组的问题类似)
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize)
{
int*arr=(int*)malloc(sizeof(int)*numsSize);
int j=0;
int i=0;
for(i=0;i<numsSize;i++)
{
arr[i]=0;
}
for(i=0;i<numsSize;i++)
{
arr[nums[i]-1]++;
}
for(i=0;i<numsSize;i++)
{
if(arr[i]==0)
{
arr[j]=i+1;
j++;
}
}
*returnSize=j;
return arr;
}
2,1394. 找出数组中的幸运数 - 力扣(LeetCode) (leetcode-cn.com)
一个数组中的幸运数就是该数字的值和这个数在数组中出现的次数相等。在思路上,这道题和上一道题类似,都是通过创建一个数组,将每一个数字出现的次数放在这个数组中与这个数的值相等的位置上。所有的数字都记录完之后,遍历一遍数组,如果下标和数值相同,就意味着这个数出现的次数和这个数的数值相等。
int findLucky(int* arr, int arrSize)
{
int tmp[500]={0};
int max=0;
for(int i=0;i<arrSize;i++)
{
tmp[arr[i]]++;
if(max<arr[i])
{
max=arr[i];
}
}
for(int i=max;i>=1;i--)
{
if(tmp[i]==i)
{
return i;
}
}
return -1;
}