一、解题思路
题目给出一个数组,包含1-n的整数,其中只有一个数据出现了重复,因此我们可以利用哈希表的知识,创建一个大小为n+1的数组has【n+1】,遍历记录对应下标出现的次数。
二、解题方法
①数组has【n+1】初始化为0
②遍历数组nums,记录数组值出现的次数,即has【n+1】的下标对应数组值加1
③再遍历一次数组has【n+1】,若has【k】=2,则为重复出现的整数,若has【k】=0,则为丢失的整数。
三、代码
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
int* result = (int*)malloc(sizeof(int) * 2);
int has[numsSize+1];
memset(has,0,sizeof(has));
for(int i=0;i<numsSize;i++)
{
has[nums[i]]++;
}
for(int i=1;i<=numsSize;i++)
{
if(has[i]==2)
result[0]=i;
if(has[i]==0)
result[1]=i;
}
*returnSize=2;
return result;
}
四、知识点
①函数传进来一个数的指针int* returnSize,需要在函数体内对他进行赋值,意为返回数组的大小。
②函数内创建的数据在该函数执行完毕之后就会自动释放空间,因此要让主函数能够访问被调用函数创建的数据必须动态分配空间malloc。其中,需要注意的是,malloc返回的指针需要进行类型转换,以匹配变量的类型。另外,分配的内存空间需要在使用完后使用free函数进行释放,以防止内存泄漏。
③memset函数是C语言中的一个标准库函数,用于将一段内存空间填充为指定的值。
其函数原型为:
void *memset(void *s, int c, size_t n);
参数解释:
- void *s:指向要填充的内存块的指针; 传入数组名称
- int c:要填充的值,通常是一个无符号字符;
- size_t n:要填充的字节数。
函数返回值为指向填充后的内存块的指针。
五、算法分析
①时间复杂度:程序有两个单层循环,O(n)。
②空间复杂度:程序创建了一个大小为n+1的哈希数组,O(n)。