国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Leetcode 201. Bitwise AND of Numbers Range

2019-11-09 20:52:37
字體:
供稿:網(wǎng)友

Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND of all numbers in this range, inclusive.

For example, given the range [5, 7], you should return 4.

s思路: 1. 簡單粗暴的做法,就是把所有數(shù)都遍歷一遍做and。這肯定不是題目要求的做法 2. 需要根據(jù)and的特點(diǎn),如果所有數(shù)全1,and結(jié)果才為1,只要有一個(gè)0,結(jié)果都是0.也就是說,and運(yùn)算是不精確的運(yùn)算! 3. 仔細(xì)看了一下,總結(jié)規(guī)律。例如:[5,7]

5:1016:1107:111

把5和7做AND可以得到101,即:高位是正確的,但是低位由于沒有and中間變化的值,所以不正確;把7-5得到010,其中1表示從這一位有翻轉(zhuǎn),由于這一位有翻轉(zhuǎn),那么1右邊的都應(yīng)該有翻轉(zhuǎn),即:看到的是從右往左第2位翻轉(zhuǎn)了,由于高位翻轉(zhuǎn)是因?yàn)榈臀环D(zhuǎn)引起的,所以低位也必然翻轉(zhuǎn),所以看到1,說明這個(gè)1和之后的所有數(shù)位都翻轉(zhuǎn)過,所以只需要找到這個(gè)差值最左邊1的位置,然后把5和7的and結(jié)果從這個(gè)位置往右所有數(shù)都置零! 4. 另外還在網(wǎng)上看到方法2,也很妙!妙在哪兒呢?從m==n這個(gè)極限條件出發(fā):當(dāng)m==n,說明m就是結(jié)果,但是大部分情況m!=n。這個(gè)解法有意思的地方,就是把m!=n的普遍情況想辦法變成m==n的邊界情況。如何變?有一個(gè)基本事實(shí)是這樣的:如果n>m,最低位必然是翻轉(zhuǎn)過的。因此,我們設(shè)置一個(gè)變量pos來記錄翻轉(zhuǎn)的bit位,然后m和n都往右移一位,繼續(xù)比較m和n,這個(gè)過程是iterative,直到m==n,此時(shí)我們也知道有多少位是翻轉(zhuǎn)過的,因此把這些位置零即可! 5. 這中思路可以推廣:從極限情況出發(fā),這里就是m==n就是極限情況,把其他的情況移位得到極限情況。

//方法1:按bit一位一位的處理。detail-oriented。bottom-up思路class Solution {public: int rangeBitwiseAnd(int m, int n) { // int res=m&n; int diff=n-m; int pos=0; while(diff){ diff>>=1; if(res&1<<pos) res=res^1<<pos; pos++; } return res; }};//方法1.1:還是一位一位的移動(dòng),優(yōu)化了一下,不用在中間用mask,最后用一次mask就可以了!29msclass Solution {public: int rangeBitwiseAnd(int m, int n) { // int res=m&n; int diff=n-m; int pos=0; while(diff){ diff>>=1; pos++; } res=res&~((1<<pos)-1); return res; }};//方法2:抓住邊界條件!這個(gè)思路也很好,就是慢點(diǎn)!52msclass Solution {public: int rangeBitwiseAnd(int m, int n) { // int pos=0; while(m!=n){ ++pos; m>>=1; n>>=1; } return m<<pos; }};
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 清镇市| 清河县| 阳城县| 柏乡县| 柳州市| 会昌县| 乌兰察布市| 长乐市| 拜城县| 临安市| 长垣县| 民勤县| 莫力| 澳门| 沧源| 惠水县| 格尔木市| 扎兰屯市| 瓦房店市| 寻甸| 泸溪县| 名山县| 东至县| 台北市| 广水市| 蛟河市| 延边| 邢台市| 新干县| 磐石市| 灵丘县| 东阳市| 桂林市| 济南市| 浦城县| 磐石市| 泰安市| 淳化县| 海门市| 旺苍县| 偏关县|