唯一成對的數 演算法很美

2021-10-11 13:29:05 字數 2476 閱讀 1341

問題:1-1000放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其它均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來;不用輔助儲存空間,能否設計乙個演算法實現?

解法一:顯然已經有人提出了乙個比較精彩的解法,將所有數加起來,減去1+2+…+1000的和。這個演算法已經足夠完美了,相信出題者的標準答案也就是這個演算法,唯一的問題是,如果數列過大,則可能會導致溢位。

解法二:異或就沒有這個問題,並且效能更好。將所有的數全部異或,得到的結果與123…1000的結果進行異或,得到的結果就是重複數。

public

class 唯一成對的數

//最後乙個數,是隨機數

arr[arr.length-1]

=new

random()

.nextint

(n-1)+

1;//隨機下標

int index =

newrandom()

.nextint

(n);

util.

swap

(arr,index,arr.length-1)

; util.

print

(arr)

;int x1 =0;

//對於任何數x,都有x^x=0,x^0=x,同自己求異或為0,同0求異或為自己

for(

int i=

1;i<= n-

1; i++

)for

(int i =

0; i < n;i++

) system.out.

println()

; system.out.

println

(x1)

; system.out.

println

("**********==有輔助空間");

(2)int

helper =

newint

[n];

for(

int i =

0; i < n; i++

)for

(int i =

0; i < n; i++)}

}}

異或的作用:

(1)判斷奇偶性

//這個實際考的不多, 太簡單

//思路:奇數的二進位制最低為一定為1,偶數的二進位制最低位一定為0,a^1

==1?偶數:奇數

(2)獲取二進位制位是1還是0

當兩個數的二進位制表示,進行異或運算時,當前位的二進位制表示不同則為1,相同則為0。

即: 0^0

=0;1^0

=1;0^1

=1;1

^1=0

;按位異或的3個特點:

(1)0異或任何數 = 任何數;

(2)1異或任何數 = 任何數取反;

(3)任何數異或自己 = 把自己置0;

按位異或的幾個常見用途:

(1)使某些特定的位翻轉

例如對數10100001 的第2位和第3位翻轉,則可以將該數與00000110進行按位異或運算。

10100001

^00000110

=10100111

(2) 實現兩個值的交換,而不必使用臨時變數。

例如交換兩個整數a =

10100001

, b =

00000110的值, 可通過下列語句實現:

a = a ^ b;

//a = 10100111

b = b ^ a;

//b = 10100001

a = a ^ b;

//a = 00000110

即等效於以下兩步:

① 執行前兩個賦值語句:「a=a∧b;」和「b=b∧a;」相當於b=b∧(a∧b)。而b∧a∧b等於a∧b∧b(異或滿**換律,結合律)。b∧b的結果為0,因為同乙個數與本身相∧,結果必為0。因此b的值等於a∧0,即a,其值為3。

② 再執行第三個賦值語句:a=a∧b。由於a的值等於(a∧b),b的值等於(b∧a∧b),因此,相當於a=a∧b∧b∧a∧b,即a的值等於a∧a∧b∧b∧b,等於b。

a得到b原來的值

(3)交換兩個整數變數的值

//交換a、b的值

a=a^b

b=a^b

a=a^b

1.借助第三個變數來實現

c=a;a=b;b=c;

2.利用加減法實現兩個變數的交換

a=a+b;b=a-b;a=a-b;

3.用位異或運算來實現,也是效率最高的

原理:乙個數異或本身等於0 ;異或運算符合交換律

a=a^b;b=a^b;a=a^b

(4)不用判斷語句,求整數的絕對值

題1 找出唯一成對的數

1 1000這1000個數放在含有1001個元素的陣列t中,只有唯一的元素值重複,其他均只出現一次,每個陣列元素只能訪問一次,請設計乙個演算法,將重複的元素找出來,不用輔助儲存空間.一般思路 過程 建立乙個長度為n 1的arr陣列 對t陣列進行遍歷 arr t i 對arr遍歷,出現2則返回當前元素...

唯一成對的數(異或的作用)

問題描述如下 1 1000這1000個數放在含有1001個元素的陣列中,只有唯一的乙個元素重複 其他均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來 不用輔助儲存空間,能否設計乙個演算法實現?三個主要的要求 只存在唯一的乙個元素重複 只能訪問一次 不允許使用輔助儲存空間 藍橋杯備戰...

找出唯一成對的數(異或運算)

1 1000這一千個數放在含有1001個元素的陣列中,只有唯一的乙個元素值重複,其他均只出現一次。每個陣列元素只能訪問一次,設計乙個演算法,將它找出來 不用輔助儲存空間,能否設計乙個演算法實現?解題思路 由於每個元素只能訪問一次,所以不能使用雙重for迴圈暴力求解,不能使用輔助空間所以也不能使用木桶...