劍指offer之找出數(shù)組中重復(fù)數(shù)字

1 問題

給的N個(gè)數(shù)字的數(shù)組,每個(gè)元素的大小范圍大于等于0小于N(0 << a[i] < N),找出數(shù)組中有哪些數(shù)字重復(fù)了并且這個(gè)數(shù)字重復(fù)了多少次,一共有幾個(gè)數(shù)字重復(fù)了。

 
2思路

由于元素的大小范圍大于等于0小于N(0 << a[i] < N),我們直接把這個(gè)元素的大小作為下標(biāo)(不會(huì)小標(biāo)越界),每出現(xiàn)一次就是把這個(gè)元素的大小作為下標(biāo)的值進(jìn)行增加1,然后最后去判斷新數(shù)組的值是否大于1


 
3 代碼實(shí)現(xiàn)

    #include <iostream>
    #include <stdlib.h>
     
    using namespace std;
     
    int main()
    {
        std::cout << "請(qǐng)輸入N個(gè)數(shù)字" << std::endl;
        int n = 0;
        std::cin >> n;
        std::cout << std::endl;
        if (n <= 0) {
            std::cout << "輸入的數(shù)字錯(cuò)誤" << std::endl;
            return -1;
        }
        int *a = new int[n];
        //初始化數(shù)組
        memset(a, 0, n * sizeof(int));
        std::cout << "分別輸入每個(gè)數(shù)字的值" << std::endl;
        for (int i = 0; i < n; ++i)
        {
            int num = 0;
            std::cin >> num;
            if (num < 0 || num >= n)
            {
                std::cout << "輸入的數(shù)字值" << a[i] << "不對(duì)" << std::endl;
                return -1;
            }
            a[num]++;
        }
        int count = 0;
        for (int i = 0; i < n; ++i)
        {
            if (a[i] > 1)
            {
                ++count;
                std::cout << "數(shù)字" << i << "重復(fù)" << a[i] << "次" << std::endl;
            }
        }
        std::cout << "總共重復(fù)的數(shù)字有" << count << "個(gè)" << std::endl;
        delete[] a;
        return 0;
    }


 
4 運(yùn)行結(jié)果

    請(qǐng)輸入N個(gè)數(shù)字
    15
     
    分別輸入每個(gè)數(shù)字的值
    2
    3
    4
    5
    4
    3
    2
    2
    3
    5
    5
    5
    5
    6
    6
    數(shù)字2重復(fù)3次
    數(shù)字3重復(fù)3次
    數(shù)字4重復(fù)2次
    數(shù)字5重復(fù)5次
    數(shù)字6重復(fù)2次
    總共重復(fù)的數(shù)字有5個(gè)


5 總結(jié)

我們要記得把值作為數(shù)組下標(biāo)的方法(前提不會(huì)下標(biāo)越界),然后在C和C++中如果要有動(dòng)態(tài)數(shù)組,我們需要new和malloc,我們不能這樣寫

    nt n = 0;
    scanf("%d\n", &n);
    int a[n] = {0};
     
    int n = 0;
    std::cin >> n >> std::endl;
    int a[n] = {0};

不然編譯會(huì)提示如下

variable-sized object may not be initialized

但是在java里面是可以這樣寫的,要注意。

 



 


作者:chen.yu
深信服三年半工作經(jīng)驗(yàn),目前就職游戲廠商,希望能和大家交流和學(xué)習(xí),
微信公眾號(hào):編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進(jìn)階人工智能(鏈接)