找出陣列中唯一成對的那個數

2021-10-23 03:37:15 字數 2055 閱讀 2178

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迴圈暴力求解,不能使用輔助空間所以也不能使用木桶...