二进制数代替数组做标记
生活随笔
收集整理的這篇文章主要介紹了
二进制数代替数组做标记
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天做一道輸出第一次出現的數題目時,使用了用一個數組存儲之前出現過的數,然后搜索數組判斷是否出現過。這是用時間換空間的方法。
當然也可以用空間換時間,如果數據范圍已知且不大,比如為1到100
可以直接定義一個大小為100的數組 初始化為0
輸入一個數時,若a[i-1]為0則輸出,并對a[i-1]做標記
然后想到了用二進制數作為標記的方法,進一步節省空間。但是只能用于數據范圍很小的數 比如0-30
若0出現了則第0位為1
30出現了則第30位置為1,即該數加上2的30次方
輸入時,比如要判斷30是否出現過,將該數除以2的30次方然后mod10不為0則第30位為1
關鍵代碼:
num[n/64]=(((num[n/64]>>(n%64))|1)<<(n%64))|num[n/64];
n為要標記的數,n/64確定標記數組中的下標,也就是數組中第一個long long 負責標記0-63 第二個標記64-127 以此類推
n%64為應該標記數組中第n/64個數的第幾位
通過先右移,最低位置1,然后左移實現修改
由于右移過程中低位丟失,所以需要再與原來的數按位取或,恢復前面的值
讀取標記位
if((num[i/64]<<63)>>63&1==1)
通過左移后右移再與1按位與判斷最低位是否為1
并且每輪num[i/64]=num[i/64]>>1; 右移一位
總結
以上是生活随笔為你收集整理的二进制数代替数组做标记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么分数是循环小数
- 下一篇: 宇宙星座信用卡怎么激活