求最接近數n的2的次方數

2021-09-29 18:47:01 字數 829 閱讀 1763

我們當然可以直接暴力求解(負次方不考慮):

int findtablesizeof2(const int target)else

}// 可能出現target是兩者的平均值,就暫且返回大值吧

return temp2power*2 - target >= target - temp2power ? temp2power*2 : temp2power;

但是前段時間看到乙個通過位運算求值得方法,實在令人嘆為觀止:

int findtablesizeof2(const int target)
乍一看可能有些蒙,我們隨便取個值來分析一下,-------就827了(1100111011)。

1100111011    -1    temp: 1100111010

0110011101    temp>>1

1110111111    temp |=    temp: 1110111111    此步主要為了保證第一位一定是1,如果所有位都為1,則已經是結果了

0011101111     temp >>2

11111111111    temp |=    temp:1111111111     這樣就保證了前兩位一定是1,以此類推(雖然已經滿足了)保證所有位為1

但是這樣並不是我們想要的結果,因為2的次方數只是高位為1,所以我們只需要再+1,就ok了。(這也是前面為什麼要減一的原因)。

其實我們平時會遇到太多以2為基數的運算,此時一定要首先考慮位運算,比如以上的演算法就會比暴力求解提公升幾百倍上千倍速度不止。常見的還有求餘數運算。比如求對2的餘:n%2---> n&1,對8的餘:n&7

最接近的數

有乙個正整數,請找出其二進位制表示中1的個數相同 且大小最接近的那兩個數。乙個略大,乙個略小 給定正整數int x,請返回乙個vector,代表所求的兩個數 小的在前 保證答案存在。測試樣例 2 返回 1,4 思路 以給出的數為基礎,先將給出的數的二進位制中有幾個1判斷出來,然後再分別判別當前數左邊...

最接近目標數的三數之和

給定乙個包括 n 個整數的陣列 nums 和 乙個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。本題只需要對上一題求三數之和進行少許的修改即可。思路 仍採用雙指標的思路,只不過需要記錄每次移動過程 現的最近的值...

最接近的三數之和

給定乙個包括 n 個整數的陣列 nums 和 乙個目標值 target。找出 nums 中的三個整數,使得它們的和與 target 最接近。返回這三個數的和。假定每組輸入只存在唯一答案。例如,給定陣列 nums 1,2,1,4 和 target 1.與 target 最接近的三個數的和為 2.1 2...