演算法中的那些騷操作

2021-10-21 20:42:34 字數 2724 閱讀 2379

使用二進位制解決過什麼問題嗎?

x = x ^ y   // (1)

y = x ^ y // (2)

x = x ^ y // (3)

把(1)中的 x 代入 (2)中的 x,有

y = x^y = (x^y)^y = x^(y^y) = x^0 = x
x 的值成功賦給了 y。

對於(3),推導如下:

x = x^y = (x^y)^x = (x^x)^y = 0^y = y
一些演算法題中, 會有"不能超過整數範圍"的要求, 但是我們沒法預知執行環境的匯流排長度

對於有符號整數:

//最大值:

int_max = int(^uint(0) >> 1)

//最小值:

int_min = ^int_max

對於無符號整數:

//最大值:

int_max = ^uint(0)

//最小值:

int_min = 0

//核心是不停地抹去低位的1

func numberof1(n int) int

return res

}

給你一組整型資料,這些資料中,其中有乙個數隻出現了一次,其他的數都出現了兩次,讓你來找出乙個數 。

原理:

func find(arr int) int 

return rs

}

案例, 雙色球儲存:

一注雙色球格式:01,02,03,04,05,06|01(20個字元)

紅區共33個號碼可選, 藍區共16個號碼可選

要儲存所有的組合:

c(33,6) * c(16, 1) = 1107568 * 16 = 17721088 注

儲存共:17721088 * 20 = 300m

使用二進位制儲存:

共使用33個bit位記錄33個紅球和16個bit位記錄16個紅球, 乙個整型儲存就夠了(64位系統), 儲存可減少一半, 結合壓縮, 會更低

場景:儲存的資料可列舉

問題:容易套用平鋪直敘的思維方式去推導電腦程式演進

遞迴的三大要素:

例:斐波那契數:1、1、2、3、5、8、13…, 求第n項的值

//明確你這個函式想要幹什麼:  f(n) 的功能是求第 n 項的值

func fibonacci(n int) int

//尋找遞迴結束條件

func fibonacci(n int) int

}//找出函式的等價關係式(遞推公式)

//根據數列規則, 乙個項的值是前兩項之和

首先建立兩個指標p1和p2,讓它們同時 指向這個鍊錶的頭節點。然後開始乙個大迴圈,在迴圈體中,讓指標p1 每次向後移動1個節點,讓指標p2每次向後移動2個節點,然後比較兩個 指標指向的節點是否相同。如果相同,則可以判斷出煉表有環,如果不同,則繼續下一次迴圈

追及問題:

在乙個環形跑道上,兩個運動員從同一地點起跑,乙個運動員速度快, 另乙個運動員速度慢。當兩人跑了一段時間後,速度快的運動員必然會 再次追上並超過速度慢的運動員,原因很簡單,因為跑道是環形的。

為什麼快的指標步長是2?因為在快的追上慢的前, 必然是相差1或2步, 如果落後1, 下次一定能追上, 如果落後2, 那麼下次一定是落後1, 再下一次就能追上

func hascycle(head *listnode) bool 

}return false

}

//輸入

["a", "b", "c"]

//輸出

["a", "b"]

["b", "c"]

["a", "c"]

例如求5中選3的組合:

1 1 1 0 0 //1,2,3

1 1 0 1 0 //1,2,4

1 0 1 1 0 //1,3,4

0 1 1 1 0 //2,3,4

1 1 0 0 1 //1,2,5

1 0 1 0 1 //1,3,5

0 1 1 0 1 //2,3,5

1 0 0 1 1 //1,4,5

0 1 0 1 1 //2,4,5

0 0 1 1 1 //3,4,5

for 

result = addto(result, indexs)

break

} }//本次迴圈沒有找到 1 0 ,說明已經取到了最後一種情況

if !find

}

聊聊那些年的騷操作!!!

適逢過年,技術文章也沒多少人願意耐著性子看,那就聊聊我那些年的騷操作。給大家講講故事的同時,如果能給列位有所啟發,那這篇文章也算是沒有白費我的腦汁子。今天要講的是有關那些年我賺錢的一些騷操作,當然都是一些小錢,但是操作性是可以借鑑或複製的。故事得從我上大學時候開始,敘事不分時間先後。不知道各位中有沒...

linux的那些騷技能

awk awk 是處理文字檔案的乙個應用程式,幾乎所有 linux 系統都自帶這個程式。它依次處理檔案的每一行,並讀取裡面的每乙個字段。對於日誌 csv 那樣的每行格式相同的文字檔案,awk可能是最方便的工具。基本用法 awk 動作 檔名 demo awk demo.txt print 列印,0 當...

string的騷操作

炒雞簡單的題目,大牛們都不看在眼裡的,怪我哦!輸入一行數字,如果我們把這行數字中的 5 都看成空格,那麼就得到一行用空格分割的若干非負整數 可能有些整數以 0 開頭,這些頭部的 0 應該被忽略掉,除非這個整數就是由若干個 0 組成的,這時這個整數就是0 你的任務是 對這些分割得到的整數,依從小到大的...