上級目錄:演算法很美
乙個陣列裡除了某乙個數字之外,其他的數字都出現了兩次。請寫程式找出這個只出現一次的數字。
異或的運算是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的二進位制形式中每一位數都進行與運算,每次與 進行與運算的位只有為...