問題描述如下
1-1000這1000個數放在含有1001個元素的陣列中,只有唯一的乙個元素重複**,**其他均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空間,能否設計乙個演算法實現?
三個主要的要求: ① 只存在唯一的乙個元素重複 ② 只能訪問一次 ③ 不允許使用輔助儲存空間
藍橋杯備戰資料《演算法之美》 chapter1——位運算這是課程展示出來的第乙個題目,還真是把我難到了…
要是可以開輔助空間的話,直接暴力掃一遍就可以了。
however, 現在不可以開輔助空間,而且還只能訪問一次,雙重迴圈判斷的方法也不行。
最後看到了題解,用到位運算中的異或 ^,體現出了異或的另外乙個作用,消除重複的元素!
這裡的**只是列舉了10個元素的情況,1000個元素只要稍微改一下就可以了, n個元素同理。
如果這個題目沒有限定1-1000的範圍的話就不能用這個方法來做了,只能通過開通輔助空間來掃了。
// 異或的作用:消除重複!
#include
#include
#include
using namespace std;
int arr[10]
;void
swap
(int
&a,int
&b)int
main()
arr[9]
=rand()
%9+1
;// 1~9之間的隨機數
int index =
rand()
%9;// 0~8之間的隨機位置
swap
(arr[index]
, arr[9]
);// 交換
for(
int i =
0; i <
10; i++
) cout << endl;
// 以上均為準備工作
// 重點在下面
int x1 =0;
for(
int i =
1; i <=
9; i++
)for
(int i =
0; i <
10; i++
) cout << x1 << endl;
return0;
}
【end】感謝** 找出唯一成對的數(異或運算)
1 1000這一千個數放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其他均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來 不用輔助儲存空間,能否設計乙個演算法實現?解題思路 由於每個元素只能訪問一次,所以不能使用雙重for迴圈暴力求解,不能使用輔助空間所以也不能使用木桶...
唯一成對的數 演算法很美
問題 1 1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來 不用輔助儲存空間,能否設計乙個演算法實現?解法一 顯然已經有人提出了乙個比較精彩的解法,將所有數加起來,減去1 2 1000的和。這個演算法已經足夠完美...
題1 找出唯一成對的數
1 1000這1000個數放在含有1001個元素的陣列t中,只有唯一的元素值重複,其他均只出現一次,每個陣列元素只能訪問一次,請設計乙個演算法,將重複的元素找出來,不用輔助儲存空間.一般思路 過程 建立乙個長度為n 1的arr陣列 對t陣列進行遍歷 arr t i 對arr遍歷,出現2則返回當前元素...