【剑指offer】03--找出数组中任意一个重复的数字,C++实现

原创博文,转载请注明出处!

# 题目

image

# 思路:

       对数组排序,在排序过程中找出任意一个重复的数字。排序的原则是保证数组下标i和数字i相对应,当有多个数字对应数组下标i时,则找到重复数字。举例:

数组2310253,下标0对应的数字是2,数字2与下标0不一致,交换下标0和下标2对应的数字,交换后的结果为1320253; 数组1320253,下标0对应的数字是1,数字1与下标0不一致,交换下标0和下标1对应的数字,交换后的结果为3120253;数组3120253,下标0对应的数字是3,数字3与下标0不一致,交换下标0和下标3对应的数字,0123253。数组0123253,下标4对应的数字是2,下标2对应的数字也是2,下标4对应的数字是重复数字。

image

# 代码

#include <iostream>

using namespace std;

class Solution {
public:

    /*
    函数参数:
        numbers数组
        length数组长度
        duplication重复数字
    函数返回值:
        bool类型,true表示存在重复数字,false表示不存在重复数字
    */

    bool duplicate(int numbers[], int length, int* duplication)
    {
        /* 特殊输入检查 */
        // 空数组/长度小于0
        if(numbers == nullptr || length <= 0)
            return false;

        // 数组元素不符合题干
        for(int i=0; i<length;++i)
        {
            if(numbers[i]<0 || numbers[i]>length-1)
                return false;
        }

        /* 找出任意一个重复元素*/
        for(int i=0;i<length;i++)
        {
            while(numbers[i]!=i)
            {
                // 查找重复元素
                if(numbers[i] == numbers[numbers[i]])
                {
                    *duplication = numbers[i];
                    return true;
                }
                else
                {
                    int temp = numbers[i];
                    numbers[i] = numbers[temp];
                    numbers[temp] = temp;
                }

            }
        }

        return false;
    }
};
int main()
{
    /* 参数列表 */
    int numbers[7] = {3,1,2,0,0,5,3};
    int length = 7;
    int *duplication;

    /* 类 */
    Solution solution;
    cout<<solution.duplicate(numbers,length,duplication)<<endl;
    cout<<*duplication<<endl;
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wanglei5205/p/9024943.html