剑指 Offer 03. 数组中重复的数字(C语言)

剑指 Offer 03. 数组中重复的数字(C语言)

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;
}
posted @ 2021-08-21 11:26  forbit  阅读(196)  评论(0)    收藏  举报