剑指 Offer 03. 数组中重复的数字(C语言)
剑指 Offer 03. 数组中重复的数字(C语言)
-
- 2.1. version 0.1
- 2.2. version 0.2(success)
- 2.3. version 0.3
1. Title
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。。。。。
详情:点击这里
2. Do it
2.1. version 0.1
/*!
* @file 03findRepeatNumber.c
* @date 2021-8
* @author forbit
* @version 0.1
* @brief 使用暴力遍历方法
* @todo 可尝试哈系树的方法
* @short {short description}
* @details score:用时过久,不过关。
*/
int findRepeatNumber(int* nums, int numsSize){
/*!
* @brief:
* @param[in] nums 数组
* @param[out] numsSize 数组长度
* @return 数组中任意一个重复的数字
*/
//! 入参判断
if(numsSize==0 || nums==NULL) return 0;
for(int i=0; i<numsSize; i++)
for(int j=i+1; j<numsSize; j++)
if(nums[i] == nums[j])
return nums[i];
return 0;
}
2.2. version 0.2(success)
/*!
* @file 03findRepeatNumber.c
* @date 2021-8
* @author forbit
* @version 0.2
* @brief 尝试哈系树的理念,把数值填进去新的数组,如果这个数组已经有数值了,那么说明这个是重复的数。
* @todo
* @short {short description}
* @details score:24-32ms,beats:82-99%。
*/
int findRepeatNumber(int* nums, int numsSize){
/*!
* @brief:
* @param[in] nums 数组
* @param[out] numsSize 数组长度
* @return 数组中任意一个重复的数字
*/
//! 入参判断
if(numsSize==0 || nums==NULL) return 0;
int repeat_number=0; //!<用于循环,不可重复使用
int array_hash[numsSize]; //!< 数组对应的哈系数数组
//! 对数组进行初始(初始值数组长度)赋值,使用循环构建哈希树,当发现array_hash[nums[i]] != numsSize说明已经被填充。
for(int i=0; i<numsSize; i++) array_hash[i] = numsSize;
for(repeat_number; repeat_number<numsSize; repeat_number++)
{
if(array_hash[nums[repeat_number]] != numsSize) break;
array_hash[nums[repeat_number]] = repeat_number;
}
return nums[repeat_number];
}
2.3. version 0.3
/*!
* @file 03findRepeatNumber.c
* @date 2021-8
* @author forbit
* @version 0.3
* @brief 构建哈希树。想只遍历一次数组的。
* @todo
* @short {short description}
* @details 未完成,解答有误。
*/
int findRepeatNumber(int* nums, int numsSize){
/*!
* @brief:
* @param[in] nums 数组
* @param[out] numsSize 数组长度
* @return 数组中任意一个重复的数字
*/
//! 入参判断
if(numsSize==0 || nums==NULL) return 0;
int *array_hash = (int*)malloc(numsSize*4); //! 开辟array_hash空间
// 构建哈希树
for(int i=0; i<numsSize; i++)
{
if(array_hash[nums[i]] < numsSize && array_hash[nums[i]] >= 0 )
return nums[i];
array_hash[nums[i]] = i;
}
free(array_hash); //! 释放array_hash空间
return 0;
}

浙公网安备 33010602011771号