演算法很美 位運算 找出落單的那個數

2021-10-05 17:11:49 字數 1484 閱讀 8813

上級目錄:演算法很美

乙個陣列裡除了某乙個數字之外,其他的數字都出現了兩次。請寫程式找出這個只出現一次的數字。

異或的運算是a ^ a=0,也就是說偶數個相同的元素異或,結果肯定是0。a ^ a ^ a =a,也就是說奇數個相同元素異或,結果是a本身。

那麼根據上面的思路,我們可以設陣列**現兩次的元素為a組元素,一次的為b組元素,那麼陣列中所有元素異或之後,最後只剩下b組元素,也就是需要求的那個數字。

package com.example.algorithm.demo.c2;

/** * 找出落單的數

*/public class c13

//填充b元素

arr[n/2]

= n/2;

//進行異或運算

int x1 = 0;

for(int i = 0; i < arr.length; i ++)

system.out.println(

"異或b:"+x1);}

}

假設陣列arr符合條件,我們設計另外乙個陣列helper對arr進行遍歷每次迴圈對helper[arr[i]]做加一操作,那麼最終下標是a組元素的helper陣列的值是2,b組元素的helper陣列的值是1,所以只需要再次進行迴圈,找出helper陣列值為1 的下標,並且把他輸出即可

package com.example.algorithm.demo.c2;

/** * 找出落單的數

*/public class c13

//填充b元素

arr[n/2]

= n/2;

system.out.println(

"**********===異或破解==========");

//進行異或運算

int x1 = 0;

for(int i = 0; i < arr.length; i ++)

system.out.println(

"異或b:"+x1)

; system.out.println(

"**********===暴力破解==========");

//輔助陣列helper,去重之後陣列長度為a/2+b=

(n-1)/2+1=

(n+1)/2,因為n是奇數所以陣列長度最終為n/2+1

int [

] helper = new int[n/2+1]

; //遍歷下標為arr[i]的helper陣列

for(int i = 0; i < arr.length; i ++)

//得到b

for(int i =0; i< helper.length; i ++)}}

}

找出落單出現的那個數字

題目描述 乙個陣列除了某乙個數字只有乙個外,其餘的數字都是成對出現的 求出這個落單的數字 思路 使用異或的特性,可以抵消陣列中相同的數字,則剩下的哪個數字就是落單的數字 示例 乙個陣列除了某乙個數字只有乙個外,其餘的數字都是成對出現的 public class unique number integ...

位運算的應用 找出落單的數

基本描述 乙個陣列裡面除了某乙個數字之外,其他的數字都出現了兩次。設計乙個演算法去找出這個只出現了一次的數字。要是沒學過位運算的話,估計又想著去暴力列舉了,不合適,資料量大了會很麻煩的,還是用位運算。因為陣列中只有乙個元素是不重複兩次的,用0去一次與陣列元素進行異或,出現兩次的數異或之後為0,只出現...

演算法很美 位運算 二進位制中 的個數

上級目錄 演算法很美 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示 的個數。例如 的二進位制表示為1001,有2為是 整數n有 位,假設當n與上 整數a 1第i 0 i 0 思路如下1 整數字有 位,因此只需要讓 左移 次,與n的二進位制形式中每一位數都進行與運算,每次與 進行與運算的位只有為...