2. 開闢輔助空間
1-1000這1000個數放在含有1001個元素的陣列中,只有唯一的乙個元素重複,其它均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助空間,能否實現?
不使用輔助空間,我們可以想到的是用異或 ( ^ ) 來解決問題。
異或的用法是:a0=a,aa=0。我們可以得到,當相同的數進行異或的時候,就會得到0。這個時候得到的陣列的那個成對的數就會異或為0。但是如果,我們將這個陣列與 1-1000的數進行異或,剩下的數就是唯一成對的那個數 。
如 ( a^ b^ b^ c… ) ^ ( a^ b^ c… ) 即 a^ a^ b^ b^ b^ c^ c… 這個結果得到的就是b,即就是我們要的結果,陣列中唯一成對的那個數。
核心**
int n =
1001
;int result =0;
for(
int i =
1; i <= n-
1; i++
)for
(int i =
0; i < n; i++
)
完整**
為了使** main 函式**看上去更簡潔,我將 交換陣列元素的值 和 輸出陣列 寫成兩個方法
public
static
void
main
(string[
] args)
//最後乙個數,是隨機數
arr[arr.length-1]
=new
random()
.nextint
(n-1);
//取隨機索引,將上一行**生成的隨機數,插入到arr陣列中去
int index =
newrandom()
.nextint
(n);
swap
(arr, index, arr.length-1)
;//交換陣列元素的值
print
(arr)
;//輸出陣列元素
int result =0;
for(
int i =
1; i <= n-
1; i++
)for
(int i =
0; i < n; i++
) system.out.
println
("陣列中唯一成對的那個數是"
+result);}
//交換陣列元素的值
public
static
void
swap
(int
arr,
int i,
int j)
//輸出陣列
public
static
void
print
(int
arr)
system.out.
println("");}
這種方法,也就是建立乙個陣列,我姑且把這個新陣列命名為 helper,開闢輔助空間的原理就是記錄 arr 陣列出現過的數,即,arr 陣列的元素值,為 helper 陣列的索引,當出現乙個 讀取 arr 陣列元素值的時候,就在 helper 陣列的索引加 1 ,因為存在成對的數,所以當遍歷完整個 arr 陣列之後, helper 陣列中索引是成對的那個數的元素值為2,輸出 helper 陣列中,元素為2的那個陣列,就是我們要找的陣列**現成對的那個數。
也許上面的話,可能有點饒,看下面的核心**也許你就理解了。
核心**
int
helper =
newint
[n];
for(
int i =
1; i < n; i++
)for
(int i =
1; i < n; i++
)}
結了,如果是找出陣列中落單的那個數,那就更簡單了,直接對這個陣列進行異或即可。 題解 如何找陣列中唯一成對的那個數
1 1000這1000個數放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其他均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來 不用輔助儲存空間,能否設計乙個演算法實現?根據a a 0,a 0 a這兩條性質,我們可以把陣列中的元素全部異或起來,然後再異或一遍不重複的所有元...
題1 找出唯一成對的數
1 1000這1000個數放在含有1001個元素的陣列t中,只有唯一的元素值重複,其他均只出現一次,每個陣列元素只能訪問一次,請設計乙個演算法,將重複的元素找出來,不用輔助儲存空間.一般思路 過程 建立乙個長度為n 1的arr陣列 對t陣列進行遍歷 arr t i 對arr遍歷,出現2則返回當前元素...
找出唯一成對的數(異或運算)
1 1000這一千個數放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其他均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來 不用輔助儲存空間,能否設計乙個演算法實現?解題思路 由於每個元素只能訪問一次,所以不能使用雙重for迴圈暴力求解,不能使用輔助空間所以也不能使用木桶...