演算法學習100天 1 初識

2022-09-24 05:54:11 字數 1176 閱讀 2028

5種符號 ^(異或) &(與) ~(非) |(或) >>(右移) <<(左移)

異或

可以看做是二進位制無進製相加

0^n = nn^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。...