二进制数代替数组做标记
今天做一道輸出第一次出現(xiàn)的數(shù)題目時(shí),使用了用一個(gè)數(shù)組存儲之前出現(xiàn)過的數(shù),然后搜索數(shù)組判斷是否出現(xiàn)過。這是用時(shí)間換空間的方法。
當(dāng)然也可以用空間換時(shí)間,如果數(shù)據(jù)范圍已知且不大,比如為1到100
可以直接定義一個(gè)大小為100的數(shù)組 初始化為0
輸入一個(gè)數(shù)時(shí),若a[i-1]為0則輸出,并對a[i-1]做標(biāo)記
然后想到了用二進(jìn)制數(shù)作為標(biāo)記的方法,進(jìn)一步節(jié)省空間。但是只能用于數(shù)據(jù)范圍很小的數(shù) 比如0-30
若0出現(xiàn)了則第0位為1
30出現(xiàn)了則第30位置為1,即該數(shù)加上2的30次方
輸入時(shí),比如要判斷30是否出現(xiàn)過,將該數(shù)除以2的30次方然后mod10不為0則第30位為1
關(guān)鍵代碼:
num[n/64]=(((num[n/64]>>(n%64))|1)<<(n%64))|num[n/64];
n為要標(biāo)記的數(shù),n/64確定標(biāo)記數(shù)組中的下標(biāo),也就是數(shù)組中第一個(gè)long long 負(fù)責(zé)標(biāo)記0-63 第二個(gè)標(biāo)記64-127 以此類推
n%64為應(yīng)該標(biāo)記數(shù)組中第n/64個(gè)數(shù)的第幾位
通過先右移,最低位置1,然后左移實(shí)現(xiàn)修改
由于右移過程中低位丟失,所以需要再與原來的數(shù)按位取或,恢復(fù)前面的值
讀取標(biāo)記位
if((num[i/64]<<63)>>63&1==1)
通過左移后右移再與1按位與判斷最低位是否為1
并且每輪num[i/64]=num[i/64]>>1; 右移一位
總結(jié)
以上是生活随笔為你收集整理的二进制数代替数组做标记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么分数是循环小数
- 下一篇: C 语言读写中文出现乱码