[leetcode] 位運算

位運算這類題目奇思妙招很多,優化方法更是非常考驗經驗積累。

常用小技能:

  1. bit_count():返回整數的二進制表示中1的個數,e.g.
x = 7
x.bit_count() # 3

2.bit_length():返回整數的二進制表示的長度,e.g.

x = 5
x.length() # 3

3.bin(x)[2:]:返回整數的二進制表示的字符串,[2:]是為了去除開頭的0b,e.g.

x = 5
bin(x)  # 0b101
bin(x)[2:]  # 101

4.int(s, 2):返回二進制表示的字符串對應的整數,e.g.

s = "111"
int(s, 2) # 7

5.統計每一位上1的個數:

nums = [1,2,3]
# 第32位是符號位
for i in range(31):cnt = sum(x>>i&1 for x in nums)

運算優先級

位運算題目中涉及大量的運算符級聯,如果沒有處理好運算優先級,結果會相差甚遠。因此,要適時地添加括號。

1.指數運算符(**)
2.一元運算符(如 +、-、~)
3.乘法、除法、取模和整除(*、/、%、//)
4.加法和減法(+、-)
5.位移運算符(<<、>>)
6.位與運算符(&)
7.位異或運算符(^)
8.位或運算符(|)
9.比較運算符(如 <、<=、>、>=、==、!=)
10.身份運算符(is、is not)
11.成員運算符(in、not in)
12.邏輯運算符(not、and、or)
13.賦值運算符(如 =、+=、-=、*= 等)

一、基礎題

3370. 僅含置位位的最小整數
3226. 使兩個整數相等的位更改次數
1356. 根據數字二進制下 1 的數目排序
461. 漢明距離
2220. 轉換數字的最少位翻轉次數
1342. 將數字變成 0 的操作次數
476. 數字的補數
1009. 十進制整數的反碼
868. 二進制間距
2917. 找出數組中的 K-or 值
693. 交替位二進制數
2657. 找到兩個數組的前綴公共數組
231. 2 的冪
342. 4 的冪
191. 位 1 的個數
338. 比特位計數
2595. 奇偶位數
2154. 將找到的值乘以 2
3211. 生成不含相鄰零的二進制字符串

# 3370. 僅含置位位的最小整數
class Solution:def smallestNumber(self, n: int) -> int:ans = 1 << n.bit_length()return (1 << n.bit_length()) - 1

本題的方法經常用來求與整數x二進制表示相同長度且各位都是1的數。注意,一定要加括號,減號優先級比<<高,不加括號求值順序是錯的。

# 461. 漢明距離
class Solution:def hammingDistance(self, x: int, y: int) -> int:return (x^y).bit_count()

本題的方法經常用來求兩個整數二進制表示中不同位的個數

# 476. 數字的補數
class Solution:def findComplement(self, num: int) -> int:return ((1<<num.bit_length())-1)^num

本題的方法經常用來求與整數x的二進制表示中各位相反的數

# 2917. 找出數組中的 K-or 值
class Solution:def findKOr(self, nums: List[int], k: int) -> int:mx=max(x.bit_length() for x in nums)ans=0for i in range(mx):cnt=sum(x>>i&1 for x in nums)if cnt>=k:ans|=1<<ireturn ans

本題是求數組中所有數的每一位上1的總數的經典做法

可以看出,位運算的題目雖然總是可以通過逐個遍歷各個位上的值來解決,但如果能巧用位運算,可以極大地提升效率。

二、異或(XOR)

異或(XOR)常用的性質有:

  1. a ⊕ a = 0
  2. a ⊕ b = c
    ==> a = c ⊕ b
  3. 擴展到多個數:
    假設An = a[1] ⊕ a[2] ⊕ … ⊕ a[n]
    那么 a[n] = An ⊕ Am (其中,m = n-1)

1486. 數組異或操作
1720. 解碼異或后的數組
2433. 找出前綴異或的原始數組
1310. 子數組異或查詢
2683. 相鄰值的按位異或

# 1720. 解碼異或后的數組
class Solution:def decode(self, encoded: List[int], first: int) -> List[int]:m=len(encoded)ans=[first]+[0]*mfor i in range(1,m+1):ans[i]=ans[i-1]^encoded[i-1]return ans

題目中,encoded[i] = arr[i] XOR arr[i + 1],那么可得:arr[i] = encoded[i-1] XOR arr[i-1]

# 2433. 找出前綴異或的原始數組
class Solution:def findArray(self, pref: List[int]) -> List[int]:return [pref[0]]+[x^y for x,y in pairwise(pref)]

題目中,pref[i] = arr[0] ^ arr[1] ^ ... ^ arr[i],那么pref[i-1] = arr[0] ^ arr[1] ^ ... ^ arr[i-1],可得:arr[i] = pref[i] ^ pref[i-1]

# 1310. 子數組異或查詢
class Solution:def xorQueries(self, arr: List[int], queries: List[List[int]]) -> List[int]:n=len(arr)pre=[arr[0]] + [0]*(n-1)# 前綴異或for i in range(1,n):pre[i]=arr[i]^pre[i-1]return [pre[r]^pre[l-1] if l>0 else pre[r] for l,r in queries]

三、與(&) 和 或(|)

“AND 的數越多,結果越小。OR 的數越多,結果越大。” - 靈神

2980. 檢查按位或是否存在尾隨零
1318. 或運算的最小翻轉次數
2419. 按位與最大的最長子數組
2871. 將數組分割成最多數目的子數組
2401. 最長優雅子數組
2680. 最大或值
3133. 數組最后一個元素的最小值

# 2419. 按位與最大的最長子數組
class Solution:def longestSubarray(self, nums: List[int]) -> int:mx=max(nums)ans=cnt=0for x in nums:# 可能有多個子數組,子數組里都是最大值,要取最長的子數組if x==mx:cnt+=1ans=max(ans,cnt)else:cnt=0return ans

這題要求按位與最大的值,那肯定是最大值跟最大值自己與最大了,所以就是求全是由最大值組成的子數組的最大長度。注意,可能會有多個全是由最大值組成的子數組,我們要找出其中長度最大的。

# 2401. 最長優雅子數組
class Solution:def longestNiceSubarray(self, nums: List[int]) -> int:ans=all=left=0for i,x in enumerate(nums):while all&x:# 通過異或把左邊界刪掉all^=nums[left]left+=1all|=xans=max(ans,i-left+1)return ans

本題巧妙地通過異或把窗口左邊界的值刪掉,通過或拓展窗口的右邊界,太妙了!適合反復練習體會。

# 2680. 最大或值
class Solution:def maximumOr(self, nums: List[int], k: int) -> int:n=len(nums)# 后綴suf=[0]*nfor i in range(n-2,-1,-1):suf[i]=suf[i+1]|nums[i+1]ans=pre=0for i,x in enumerate(nums):ans=max(ans,pre|x<<k|suf[i])pre|=xreturn ans

本題適合跟前后綴題目一起練習

# 3133. 數組最后一個元素的最小值
class Solution:def minEnd(self, n: int, x: int) -> int:ans, cnt = x, n-1i = 0while cnt:if x >> i & 1 == 0:if cnt & 1 == 1:ans |= 1 << icnt >>= 1i += 1return ans

本題要求數組的所有元素按位與的結果等于x,那就是說凡是x的二進制表示中是位1的,數組中所有元素對應的位置也必須是1。要求數組是嚴格遞增的,那只能在x的二進制表示中位置是0的逐個置1。假設把x中位置是0的全部抽出來:…00000,那么逐個置1就是按照 0001, 0010, 0011, 0100, … 的順序往上遞增。因為x已經是數組中的最小值了,所以需要往上遞增n-1次。那只要把n-1的二進制表示中1的位置按序或到x的位0位置就可以了。



整理自leetcode 靈神題單:https://leetcode.cn/discuss/post/3580371/fen-xiang-gun-ti-dan-wei-yun-suan-ji-chu-nth4/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94142.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94142.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94142.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于assert()函數,eval()函數,include

一.assert()函數例子assert("strpos($file, ..) false") or die("Detected hacking attempt!");assert("file_exists($file)") or die("That file doesnt exist!");第一個是會檢驗$file是否有.. &#xff0c;如果有strpos會返回true&…

ICT模擬零件測試方法--電位器測試

ICT模擬零件測試方法–電位器測試 文章目錄ICT模擬零件測試方法--電位器測試電位器測試電位器測試配置電位器測試配置電位器測試注意事項電位器測量選項電位器測試 電位器測試測量從 0.1 歐姆到 10M 歐姆的電阻。 本節介紹&#xff1a; 電位器測試配置電位器測試注意事項電位…

wsl2使用宿主機網絡方法

在Windows的資源管理器的地址欄輸入&#xff1a; %UserProfile% &#xff0c;即可打開當前用戶的主目錄&#xff0c;創建文件&#xff1a; .wslconfig 輸入[experimental]networkingModemirroredautoProxytrue之后重啟WSL 管理員身份運行PowerShell&#xff1a; 停止WSL&#x…

當Windows遠程桌面出現“身份驗證錯誤。要求的函數不受支持”的問題

當Windows遠程桌面出現“身份驗證錯誤。要求的函數不受支持”的問題時&#xff0c;可以參考以下方法解決&#xff1a;修改組策略設置適用于Windows專業版、企業版等有組策略編輯器的系統。1. 按下WinR組合鍵&#xff0c;輸入“gpedit.msc”&#xff0c;打開本地組策略編輯器。2…

零售新范式:開源AI大模型、AI智能名片與S2B2C商城小程序源碼驅動下的圈層滲透革命

摘要&#xff1a;在消費圈層化與渠道碎片化的雙重沖擊下&#xff0c;傳統零售渠道的"廣撒網"模式逐漸失效。阿里巴巴零售通、京東新通路、國美Plus等零售巨頭通過技術賦能重構小店生態&#xff0c;但其本質仍停留于供應鏈效率提升層面。本文創新性提出"開源AI大…

電池自動生產線:科技賦能下的高效制造新范式

在當今科技飛速發展的時代&#xff0c;電池作為眾多電子設備和新能源產業的核心部件&#xff0c;其生產效率與質量至關重要。電池自動生產線的出現&#xff0c;猶如一場及時雨&#xff0c;為電池制造行業帶來了全新的變革與發展機遇。自動化流程&#xff0c;開啟高效生產之門傳…

CS224n:Word Vectors and Word Senses(二)

目錄 一、共現矩陣 1.1 基于共現矩陣的詞向量 二、SVD分解 2.1 基于共現矩陣的詞向量 vs. Word2Vec詞向量 三、GloVe詞向量 3.1 GloVe詞向量的好處 3.2 GloVe的一些結果展示 部分筆記來源參考 Beyond Tokens - 知乎 (zhihu.com) NLP教程(1) - 詞向量、SVD分解與Word2V…

I Built an Offline-Capable App by Myself: React Native Frontend, C# Backend

This isn’t a story about gluing together a few UI components. It’s about how I, as a solo developer, built a complete mobile application that works offline, syncs data automatically when online, and shares a unified backend with a web-based admin panel. …

在Idea中,配置maven

? 哈嘍&#xff0c;屏幕前的每一位開發者朋友&#xff0c;你們好呀&#xff01;?? 當你點開這篇文章時&#xff0c;或許正對著 IDE 里閃爍的光標發呆&#xff0c;或許剛解決一個卡了三天的 bug&#xff0c;正端著咖啡松口氣 —— 不管此刻的你在經歷什么&#xff0c;都想先和…

mac 字體遍歷demo

文章目錄邏輯字體類頭文件實現文件使用文件主程序CMakeLists文件腳本文件邏輯字體類 #ifndef LOGICAL_FONT_H #define LOGICAL_FONT_H#include <string> #include <memory> #include <CoreText/CoreText.h> #include <CoreFoundation/CoreFoundation.h&g…

2025牛客多校第六場 D.漂亮矩陣 K.最大gcd C.棧 L.最小括號串 個人題解

L.最小括號串 #數組操作 #貪心 題目 思路 感謝Leratiomyces大佬賽時的提示&#xff0c;否則估計還一直簽不了到&#xff08;&#xff09; 首先&#xff0c;貪心地構造出最優情況&#xff1a;數組左半部分全是(&#xff0c;右半部分全是)&#xff0c;隨后通過判斷給定的區間…

Ubuntu搭建PX4無人機仿真環境(5) —— 仿真環境搭建(以Ubuntu 22.04,ROS2 Humble 為例)

目錄前言1. 準備下載源碼方式一&#xff1a;方式二&#xff1a;安裝依賴安裝 Gazebo2. 安裝 Micro XRCE-DDS Agent3. 編譯4. 通信5. offboard 測試參考前言 本教程基于 ROS2 &#xff0c;在搭建之前&#xff0c;需要把 ROS2、QGC 等基礎環境安裝配置完成。但是這塊的資料相比較…

自動駕駛中的傳感器技術11——Camera(2)

1、自駕Camera關鍵技術點匯總 ADAS Camera 關鍵技術點摘選&#xff08;IEEE-P2020工作組&#xff09;如下&#xff1a; Ref &#xff1a; 5. IEEE 相關標準 - 圖像質量與色彩技術知識庫 https://www.image-engineering.de/content/library/white_paper/P2020_white_paper.pd…

福彩雙色球第2025088期籃球號碼分析

蔡楚門福彩雙色球第2025088期籃球號碼分析&#xff0c;上期開出籃球號碼數字08&#xff0c;數字形式是合數偶數2路球數字&#xff0c;小號區域&#xff0c;0字頭數字。本期籃球號碼分析&#xff0c;4尾數0414遺漏9期上次遺漏11期&#xff0c;2尾數0212遺漏4期上次遺漏27期&…

【兆易創新】單片機GD32F103C8T6系列入門資料

GD32F103xx 系列器件是一款基于ARM Cortex-M3 RISC內核的32位通用微控制器&#xff0c;在處理能力、降低功耗和外設方面具有超優的性價比。Cortex-M3是下一代處理器核心&#xff0c;它與嵌套矢量中斷控制器(NVIC)&#xff0c; SysTick計時器和高級調試支持緊密耦合。 GD32F103…

高效輕量的C++ HTTP服務:cpp-httplib使用指南

文章目錄httplib介紹與安裝使用案例httplib介紹與安裝 C HTTP 庫&#xff08;cpp-httplib&#xff09;是一個輕量級的 C HTTP 客戶端/服務器庫&#xff0c;它提供了簡單的 API 來創建 HTTP 服務器和客戶端&#xff0c;支持同步和異步操作。以下是一些關于cpp-httplib 的主要特…

24 SAP CPI 調用SAP HTTP接口

SAP CPI 訪問SAP接口一般用RFC或者HTTP,個人在項目中兩種方法都用過,最后還是傾向于HTTP的方式,此方式易于維護,統一管理,接口搭建比較方便。 讀者朋友可網上自行搜索"SAP 發布HTTP接口",SAP CPI調用SAP發布的HTTP接口。 配置CPI接口前,需要將CPI的證書導入…

C/C++常用字符串函數

一、字符串函數介紹&#xff1a; 字符串作為程序中常用的數據類型&#xff0c;學會對字符串進行處理是作為一名C/C程序員的基本功&#xff0c;我們要學會使用相關函數&#xff0c;并且對重點函數要會自己手動實現&#xff08;下文對重點函數有實現代碼以及相關示例&#xff09…

YOLO的Python實現以及 OpenCV

YOLO的Python實現以及 OpenCV Darknet 實現 YOLO 從頭開始開發 YOLO模型不容易&#xff0c;所以我們要使用預訓練模型在項目里進行目 標檢測。你可以在 https://pjreddie.com里到所有可用的預訓練模型。這是 Joseph C. Redmon的主頁&#xff0c;他是 Darknet的維護者。 注意 …

譯|Netflix 數據平臺運營中基于機器學習自動修復系統

來自上傳文件中的文章《Evolving from Rule-based Classifier: Machine Learning Powered Auto Remediation in Netflix Data Platform》 本文介紹了Netflix如何將基于規則的錯誤分類器與機器學習服務集成&#xff0c;實現Spark作業失敗的自動修復。技術亮點包括結合規則和ML智…