面试题3:数组中重复的数字

  •  
  • #include <iostream>
    /*
        面试题3:数组中重复的数字:
        问题:   长为n的数组,每个元素大小都在0到n-1之间,请找出其中重复的数字
        解决:  1. 排序o(nlogn)
                2. 用哈希表,哈希函数将键key映射为数组下标o(n),空间复杂度(n)
                3. 没有重复且排好序时,下标和值应该是相等的,所以扫描数组:
                        当该处的值不在其位时,把它放到它应在的位置上
                        当该处的值在其位时,扫描下一个元素
                        一句话:把不再其位的值放到它应在的位置上
    
    
    */
    using namespace std;
    const int MAX = 1000;
    int array_n[MAX];
    int n;
    int main(void)
    {
        cin >> n;
        for (int i = 0; i < n; i++)
            cin >> array_n[i];
    
        int i=0;
        bool find_duplicates = false;
        int duplicates = 0;
        while(true)
        {
            if(i == n)
                break;
    
            // 在其位时,扫描下一个元素
            if (array_n[i] == i)
                i++;
            else
            {
                // 交换位置前查重
                if (array_n[array_n[i]] == array_n[i])
                {
                    find_duplicates = true;
                    duplicates = array_n[i];
                    break;
                }
                else
                {
                    // 不在其位时,把它放到它应在的位置上
                    int temp = array_n[array_n[i]];
                    array_n[array_n[i]] = array_n[i];
                    array_n[i] = temp;
                }
            }
        }
        if (find_duplicates) cout << duplicates;
        else cout << "not find";
        return 0;
    }

猜你喜欢

转载自www.cnblogs.com/jkn1234/p/8876580.html