5種符號 ^(異或) &(與) ~(非) |(或) >>(右移) <<(左移)
異或
可以看做是二進位制無進製相加,
0^n = n,n^n = 0
滿足交換律和結合律
三者結合使用
求最右側為1的那一位: n & (~n + 1)
求某一位是否為0:設a = 00000100, n & a ==0 ? n的第三位為0 : n第三位不為0
例題:a. 乙個陣列,有乙個數出現了奇次,其他出現了偶次,找到這個數
/**
* 這個題沒有難度,只是利用異或的性質
* a^b^c^b^c = a^b^b^c^c = a^0^0 = a
*/class solution
return m;
}}
b. 乙個陣列,有兩個數出現了奇次,其他出現了偶次,找到這兩個數
/**
* 解題思路:
* 1. 通過位運算得到a^b
* 2. 不同的兩個數異或,結果中總有一位為1,根據這個位置為1的情況,
* 可以將陣列中所有數分為兩類,一類是該位為1,一類是為0
* 3. 因為是根據a^b的結果來分的,則a和b一定分布於不同的兩組中
* 4. 再將兩組分別異或,就得到了a和b
* 【注】第4步也可以這樣:
* 將a^b的值與某一組異或,一定能得到a或b,再與a^b異或,得到另乙個
* * 這個題的難度在於:
* 1.用位運算只能取得這個兩個奇次異或(即a^b)的值
* 2.根據a^b中為1的位將陣列分為兩組
*/class solution
// 2.根據a^b的結果為1的那一位,將陣列分為兩組數
int a = m;
// 這裡得到異或結果最右側為1的那一位,m&(按位取反再加一)
int rightone = m & (~m + 1);
for(int n : nums)
}return new int;
}}
S1 演算法學習之FFT 初識
簡介 fft fast fourier transformation 是離散傅氏變換 dft 的快速演算法。即為快速傅氏變換。它是根據離散傅氏變換的奇 偶 虛 實等特 性,對離散傅利葉變換的演算法進行改進獲得的。說明 fft 是在dft 的基礎上進行改進的演算法,dft是離散傅氏變換。答 因為訊號在...
演算法學習 1
插入排序是學習演算法時最先學到的乙個演算法,很簡單,也許看一遍就會理解,從而覺得自己掌握這個基本的演算法。但是很多人可能會像我一樣,過了一段時間,提筆來寫一下插入排序的偽 就很難寫出書本上如此優雅的偽 insertion sort a for j 2 to a.length key a j inse...
演算法學習 1
劍指offer演算法題 題目描述 給你一根長度為n的繩子,請把繩子剪成整數長的m段 m n都是整數,n 1並且m 1,m n 每段繩子的長度記為k 1 k m 請問k 1 x xk m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。...