leetcode演算法專題訓練 十四 位操作專題

2021-10-18 14:13:32 字數 4319 閱讀 7643

50.pow(x,n)

題目描述:實現 pow(x, n) ,即計算 x 的 n 次冪函式。

-100.0 < x < 100.0

n 是 32 位有符號整數,其數值範圍是 [−2^31, 2^31 − 1] 。

解題思路:基於二進位制的快速冪運算,x^n 求解,將 n 轉化為二進位制數,不斷在二進位制數的n末尾判斷是1還是0,是1的話說明可以進行累乘,然後不斷右移1位即可。注意x也是不斷進行乘積的。

時間複雜度:o(logn)

空間複雜度:o(1)

class

solution

x *= x;

}return ans;

}double

mypow

(double x,

int n)

};

69.x的平方根

題目描述:實現 int sqrt(int x) 函式。

計算並返回 x 的平方根,其中 x 是非負整數。

由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。

解題思路:已經暴力法,從 x/2 開始尋找 k ,找到第乙個 k*k<=x 的數,該數即為x的平方根;在此基礎上使用二分查詢即可。

時間複雜度:o(logx)

空間複雜度:o(1)

class

solution

return l -1;

}};

136.只出現一次的數字

題目描述:給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

解題思路:對整個陣列中的元素進行異或操作,最後剩下的值就是只出現一次的元素。

時間複雜度:o(n)

空間複雜度:o(1)

class

solution

};

137.只出現一次的數字2

題目描述:給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。

你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

解題思路:位運算,每個數都有32位,從最低位0位開始,遍歷陣列累積該位上的數在%3,也就求得了該位上有用的數,按照此方法遍歷32位再累加即可求得只出現了一次的元素。該方法同樣可以求解類似問題:有乙個元素出現了一次,其餘元素出現了k(k為奇數且不為1)次。

時間複雜度:o(32*n) ≈ o(n)

空間複雜度:o(1)

class

solution

return ans;}}

;

260.只出現一次的數字3

題目描述:給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。 找出只出現一次的那兩個元素。

結果輸出的順序並不重要。

你的演算法應該具有線性時間複雜度。你能否僅使用常數空間複雜度來實現?

解題思路:先對整個陣列進行異或操作,最後剩下的元素是求解的兩個元素異或的結果,找到該結果中為1的某一位,通過該位將整個陣列分為兩個部分,每個部分各自進行異或操作也就可以得到求解的兩個元素了。

時間複雜度:o(n)

空間複雜度:o(1)

class

solution

return vector<

int>;}

};

89.格雷編碼

題目描述:格雷編碼是乙個二進位制數字系統,在該系統中,兩個連續的數值僅有乙個位數的差異。

給定乙個代表編碼總位數的非負整數 n,列印其格雷編碼序列。即使有多個不同答案,你也只需要返回其中一種。

格雷編碼序列必須以 0 開頭。

輸入: 2

輸出: [0,1,3,2]

解釋:00 - 0

01 - 1

11 - 3

10 - 2

對於給定的 n,其格雷編碼序列並不唯一。

例如,[0,2,3,1] 也是乙個有效的格雷編碼序列。

00 - 0

10 - 2

11 - 3

01 - 1

解題思路:設定乙個標誌位pos(pos初始值為 1),pos在每一次遍歷中都需要左移一位,然後再加到返回值的vector陣列裡,每一次的遍歷都通過pos相加建立新的數,然後再將這些數加到返回值陣列裡面。

時間複雜度:o(2^n)

空間複雜度:o(1)

class

solution

;int pos =1;

for(

int i =

1; i <= n; i++

) pos <<=1;

}return ans;}}

;

劍指 offer 64. 求1+2+…+n

題目描述:求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(a?b:c)。

解題思路:不能使用if,那麼就用 &&(邏輯與)操作的截斷效應來模擬if即可。

時間複雜度:o(n)

空間複雜度:o(n)

class

solution

};

劍指 offer 65. 不用加減乘除做加法

題目描述:寫乙個函式,求兩個整數之和,要求在函式體內不得使用 「+」、「-」、「*」、「/」 四則運算符號。

解題思路:通過位操作實現,異或操作 可以保留 相加後的餘數字,與操作 左移一位後 也就是 進製。

時間複雜度:o(1)

空間複雜度:o(1)

class

solution

return b;}}

;

29.兩數相除

題目描述:給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。

返回被除數 dividend 除以除數 divisor 得到的商。

整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

被除數和除數均為 32 位有符號整數。

除數不為 0。

假設我們的環境只能儲存 32 位有符號整數,其數值範圍是 [−2^31, 2^31 − 1]。本題中,如果除法結果溢位,則返回 2^31 − 1。

解題思路:既然不能夠使用乘除法和mod法,那麼就使用不斷相減的策略,計算減了多少次即可,需要用快速冪運算進行優化,其中需要注意dividend , divisor的正負號。

時間複雜度:o(logx)

空間複雜度:o(1)

class

solution}if

((dividend>

0&& divisor >0)

||(dividend<

0&& divisor<0)

) cnt = cnt;

else

cnt =

-cnt;

if(cnt > int32_max || cnt < int32_min)

return int32_max;

return cnt;}}

;

191. 位1的個數

解題思路:可以用二進位制右移不斷記錄二進位制末尾的1即可,這樣的時間複雜度為o(logx);還可以進行優化,我們知道 n-1 可以將 n最右邊的 1 變為 0111… 這樣的格式,也就是令其減少乙個二進位制位1,那麼再 n&(n-1) 即可得到消去乙個 1 之後的數,假設該數在二進位制位中有k個1,那麼時間複雜度為 o(k)

時間複雜度:o(k)

空間複雜度:o(1)

class

solution

return ans;}}

;

當然,按位與的方法也可以解決:

class

solution

};

leetcode演算法專題訓練 七 查詢專題

33.搜尋旋轉排序陣列題目描述 公升序排列的整數陣列 nums 在預先未知的某個點上進行了旋轉 例如,0,1,2,4,5,6,7 經旋轉後可能變為 4,5,6,7,0,1,2 請你在陣列中搜尋 target 如果陣列中存在這個目標值,則返回它的索引,否則返回 1 每乙個數都是獨一無二的。解題思路 二...

leetcode專題訓練 滑動視窗

1 76.最小覆蓋子串 給你乙個字串 s 乙個字串 t 返回 s 中涵蓋 t 所有字元的最小子串。如果 s 中不存在涵蓋 t 所有字元的子串,則返回空字串 注意 如果 s 中存在這樣的子串,我們保證它是唯一的答案。解答 滑動視窗就是用一左一右兩個指標來做。右指標移動,一旦滿足條件,則判斷當前長度是不...

leetcode演算法專題訓練 四 棧與佇列專題

劍指 offer 09.用兩個棧實現佇列 解題思路 設定兩個佇列,左邊的佇列用來入隊,右邊的佇列用來出隊。時間複雜度 o 1 空間複雜度 o 1 class cqueue void int value intdeletehead int val stk2.top stk2.pop return va...