在O(n)時間複雜度O(1)空間複雜度求一個數組中出現多次和未出現的數字

愛奇藝筆試題:

原題是:已知一個數組A[],大小爲N,其中每個數都爲1~N,請求出該數組中未出現的數字和出現多次的數字。

要求是時間複雜度爲O(N),空間複雜度爲O(1)

這道題的關鍵點就在於空間複雜度爲O(1),本來想到的2-bitmap因爲這點也不能實現了。

提示是:要善於利用%操作符
void appears(int r[], int n) {
	int i;
	for (i = 0; i < n; ++i)
		r[(r[i] - 1) % n] += n;
	cout << "未出現的數字爲: ";
	for (i = 0; i < n; ++i)
		if ((r[i] - 1) / n == 0)
			cout << i + 1 << " ";
	cout << endl;
	cout << "出現多次數字爲: ";
	for (i = 0; i < n; ++i)
		if ((r[i] - 1) / n > 1)
			cout << i + 1 << " ";
	cout << endl;
}
問題是:怎麼想到的?

發佈了87 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章