劍指offer之找出數(shù)組中重復數(shù)字
1 問題
給的N個數(shù)字的數(shù)組,每個元素的大小范圍大于等于0小于N(0 << a[i] < N),找出數(shù)組中有哪些數(shù)字重復了并且這個數(shù)字重復了多少次,一共有幾個數(shù)字重復了。
2思路
由于元素的大小范圍大于等于0小于N(0 << a[i] < N),我們直接把這個元素的大小作為下標(不會小標越界),每出現(xiàn)一次就是把這個元素的大小作為下標的值進行增加1,然后最后去判斷新數(shù)組的值是否大于1
3 代碼實現(xiàn)
#include <iostream>
#include <stdlib.h>
using namespace std;
int main()
{
std::cout << "請輸入N個數(shù)字" << std::endl;
int n = 0;
std::cin >> n;
std::cout << std::endl;
if (n <= 0) {
std::cout << "輸入的數(shù)字錯誤" << std::endl;
return -1;
}
int *a = new int[n];
//初始化數(shù)組
memset(a, 0, n * sizeof(int));
std::cout << "分別輸入每個數(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] << "不對" << 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 << "重復" << a[i] << "次" << std::endl;
}
}
std::cout << "總共重復的數(shù)字有" << count << "個" << std::endl;
delete[] a;
return 0;
}
4 運行結(jié)果
請輸入N個數(shù)字
15
分別輸入每個數(shù)字的值
2
3
4
5
4
3
2
2
3
5
5
5
5
6
6
數(shù)字2重復3次
數(shù)字3重復3次
數(shù)字4重復2次
數(shù)字5重復5次
數(shù)字6重復2次
總共重復的數(shù)字有5個
5 總結(jié)
我們要記得把值作為數(shù)組下標的方法(前提不會下標越界),然后在C和C++中如果要有動態(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};
不然編譯會提示如下
variable-sized object may not be initialized
但是在java里面是可以這樣寫的,要注意。
作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學習,
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎(chǔ)入門進階人工智能(鏈接)