算法思想之位運算(一)

歡迎拜訪:霧里看山-CSDN博客
本篇主題:算法思想之位運算(一)
發布時間:2025.4.12
隸屬專欄:算法

在這里插入圖片描述

目錄

  • 滑動窗口算法介紹
    • 六大基礎位運算符
    • 常用模板總結
  • 例題
    • 位1的個數
      • 題目鏈接
      • 題目描述
      • 算法思路
      • 代碼實現
    • 比特位計數
      • 題目鏈接
      • 題目描述
      • 算法思路
      • 代碼實現
    • 只出現一次的數字
      • 題目鏈接
      • 題目描述
      • 算法思路
      • 代碼實現
    • 只出現一次的數字 II
      • 題目鏈接
      • 題目描述
      • 算法思路
      • 代碼實現
    • 只出現一次的數字 III
      • 題目鏈接
      • 題目描述
      • 算法思路
      • 代碼實現

滑動窗口算法介紹

位運算(Bit Manipulation)是算法中的高效技巧,通過直接操作二進制位實現快速計算和優化存儲

六大基礎位運算符

運算符符號描述示例
按位與&兩數二進制位同為1時結果為15 & 3 → 1 (101 & 011 = 001)
按位或|任一位為1時結果為15 | 3→7 (101 | 011 = 111)
按位異或^兩數位不同時結果為1 ,無進位相加5 ^ 3 → 6 (101 ^ 011 = 110)
按位取反~0變1,1變0~5 → -6(補碼表示)
左移<<左移指定位數,低位補05 << 1 → 10 (101→1010)
右移>>右移指定位數,高位補符號位(算術右移)-5 >> 1 → -3

常用模板總結

功能代碼模板
判斷奇偶x & 1 → 1為奇,0為偶
取最低位的1x & (-x)
消去最低位的1x & (x - 1)
異或交換變量a ^= b; b ^= a; a ^= b;
生成所有子集for (mask = 0; mask < (1 << n); mask++)
快速冪右移指數,逐位判斷累乘

例題

位1的個數

題目鏈接

191. 位1的個數

題目描述

給定一個正整數 n,編寫一個函數,獲取一個正整數的二進制形式并返回其二進制表達式中 設置位 的個數(也被稱為漢明重量)。

示例 1

輸入:n = 11
輸出:3
解釋:輸入的二進制串 1011 中,共有 3 個設置位。

示例 2

輸入:n = 128
輸出:1
解釋:輸入的二進制串 10000000 中,共有 1 個設置位。

示例 3

輸入:n = 2147483645
輸出:30
解釋:輸入的二進制串 1111111111111111111111111111101 中,共有 30 個設置位。

提示

  • 1 <= n <= 231 - 1

進階
如果多次調用這個函數,你將如何優化你的算法?

算法思路

直接使用模板中消去最低位的1,直到變量為零,用一個變量計算次數即可。

代碼實現

class Solution {
public:int hammingWeight(int n) {int ret = 0;while(n){n&=(n-1);ret++;}return ret;}
};

在這里插入圖片描述

比特位計數

題目鏈接

338. 比特位計數

題目描述

給你一個整數 n ,對于 0 <= i <= n 中的每個 i ,計算其二進制表示中 1 的個數 ,返回一個長度為 n + 1 的數組 ans 作為答案。

示例 1

輸入:n = 2
輸出:[0,1,1]
解釋
0 --> 0
1 --> 1
2 --> 10

示例 2

輸入:n = 5
輸出:[0,1,1,2,1,2]
解釋
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101

提示

  • 0 <= n <= 105

進階

  • 很容易就能實現時間復雜度為 O(n log n) 的解決方案,你可以在線性時間復雜度 O(n) 內用一趟掃描解決此問題嗎?
  • 你能不使用任何內置函數解決此問題嗎?(如,C++ 中的 __builtin_popcount

算法思路

遍歷一遍數組,對于每個數,直接使用模板中消去最低位的1,直到變量為零,用一個變量計算次數即可。

代碼實現

class Solution {
public:vector<int> countBits(int n) {vector<int> ans(n+1);for(int i = 0; i <= n; i++){int count = 0, num = i;while(num){num&=(num-1);count++;}ans[i] = count;}return ans;}

在這里插入圖片描述

只出現一次的數字

題目鏈接

136. 只出現一次的數字

題目描述

給你一個 非空 整數數組 nums ,除了某個元素只出現一次以外,其余每個元素均出現兩次。找出那個只出現了一次的元素。

你必須設計并實現線性時間復雜度的算法來解決此問題,且該算法只使用常量額外空間。

示例 1
輸入:nums = [2,2,1]
輸出:1

示例 2

輸入:nums = [4,1,2,1,2]
輸出:4

示例 3

輸入:nums = [1]
輸出:1

提示

  • 1 <= nums.length <= 3 * 104
  • -3 * 104 <= nums[i] <= 3 * 104
  • 除了某個元素只出現一次以外,其余每個元素均出現兩次。

算法思路

  1. 任何數和 0 做異或運算,結果仍然是原來的數,即 a^0=a
  2. 任何數和其自身做異或運算,結果是 0,即 a^a=0
  3. 異或運算滿足交換律和結合律,即 a^b^a=b^a^a=b^(a^a)=b^0=b

代碼實現

class Solution {
public:int singleNumber(vector<int>& nums) {int ret = 0;for(auto num : nums){ret ^= num;}return ret;}
};

在這里插入圖片描述

只出現一次的數字 II

題目鏈接

137. 只出現一次的數字 II

題目描述

給你一個整數數組 nums ,除某個元素僅出現 一次 外,其余每個元素都恰出現 三次 。請你找出并返回那個只出現了一次的元素。

你必須設計并實現線性時間復雜度的算法且使用常數級空間來解決此問題。

示例 1

輸入:nums = [2,2,3,2]
輸出:3

示例 2

輸入:nums = [0,1,0,1,0,1,99]
輸出:99
提示

  • 1 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
  • nums 中,除某個元素僅出現 一次 外,其余每個元素都恰出現 三次

算法思路

設要找的數位 ret
由于整個數組中,需要找的元素只出現了一次,其余的數都出現的三次,因此我們可以根據所有數的某一個比特位的總和 %3 的結果,快速定位到 ret一個比特位上的值是0 還是 1
這樣,我們通過 ret 的每一個比特位上的值,就可以將 ret 給還原出來。

代碼實現

class Solution {
public:int singleNumber(vector<int>& nums) {int num = 0;for(int i = 0; i < 32; i++){int count = 0;for(auto n : nums){count += ((n>>i)&1);}if(count % 3)num |= (1<<i);}return num;}
};

在這里插入圖片描述

只出現一次的數字 III

題目鏈接

260. 只出現一次的數字 III

題目描述

給你一個整數數組 nums,其中恰好有兩個元素只出現一次,其余所有元素均出現兩次。 找出只出現一次的那兩個元素。你可以按 任意順序 返回答案。

你必須設計并實現線性時間復雜度的算法且僅使用常量額外空間來解決此問題。

示例 1

輸入:nums = [1,2,1,3,2,5]
輸出:[3,5]
解釋:[5, 3] 也是有效的答案。

示例 2

輸入:nums = [-1,0]
輸出:[-1,0]

示例 3

輸入:nums = [0,1]
輸出:[1,0]

提示

  • 2 <= nums.length <= 3 * 104
  • -231 <= nums[i] <= 231 - 1
    除兩個只出現一次的整數外,nums 中的其他數字都出現兩次

算法思路

出現兩次的數異或操作后會抵消,而兩個不相等的數異或后的結果,必有一個比特位是為1的,我們根據這個比特位將所有數據分為兩組。即可得出這兩個數。

  • 將所有數進行異或操作,異或后的結果中不為零的比特位即為區分點
  • 通過找出的區分點,找出兩個數。

代碼實現

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {int num = 0;for(auto n : nums){num ^= n;}// 通過最低位的1將數據分為兩組int l = (num==INT_MIN ? num : num&(-num));int sum1 = 0, sum2 = 0;for(auto n : nums){if(n & l)sum1^=n;elsesum2^=n;}return {sum1, sum2};}
};

在這里插入圖片描述

?? 寫在最后:以上內容是我在學習以后得一些總結和概括,如有錯誤或者需要補充的地方歡迎各位大佬評論或者私信我交流!!!

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

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

相關文章

封裝Tcp Socket

封裝Tcp Socket 0. 前言1. Socket.hpp2. 簡單的使用介紹 0. 前言 本文中用到的Log.hpp在筆者的歷史文章中都有涉及&#xff0c;這里就不再粘貼源碼了&#xff0c;學習地址如下&#xff1a;https://blog.csdn.net/weixin_73870552/article/details/145434855?spm1001.2014.3001…

全星APQP軟件:為用戶提供高效、合規、便捷的研發管理體驗

全星APQP軟件&#xff1a;為用戶提供高效、合規、便捷的研發管理體驗 為什么選擇全星APQP軟件系統&#xff1f; 在汽車及高端制造行業&#xff0c;研發項目管理涉及APQP&#xff08;先期產品質量策劃&#xff09;、FMEA&#xff08;失效模式與影響分析&#xff09;、CP&#x…

CTF--網站被黑

一、原題&#xff1a; &#xff08;1&#xff09;提示&#xff1a;網站被黑了 黑客會不會留下后門 &#xff08;2&#xff09;原網頁&#xff1a; 二、步驟&#xff1a; 1.在終端掃描網址&#xff1a; 2.掃描后發現&#xff1a;shell.php 3.輸入網址&#xff1a;http://117.…

入門到精通,C語言十大經典程序

以下是十個經典的C語言程序示例&#xff0c;這些程序涵蓋了從基礎到稍復雜的應用場景&#xff0c;適合初學者和有一定基礎的開發者學習和參考。 1. Hello, World! 這是每個初學者學習編程時的第一個程序&#xff0c;用于驗證開發環境是否正確配置。 #include <stdio.h>…

神經網絡入門—自定義神經網絡續集

修改網絡 神經網絡入門—自定義網絡-CSDN博客 修改數據集&#xff0c;yx^2 # 生成一些示例數據 x_train torch.tensor([[1.0], [2.0], [3.0], [4.0]], dtypetorch.float32) y_train torch.tensor([[1.0], [4.0], [9.0], [16.0]], dtypetorch.float32) 將預測代碼改為&…

【browser-use+deepseek】實現簡單的web-ui自動化

browser-use Web-UI 一、browser-use是什么 Browser Use 是一款開源Python庫&#xff0c;專為大語言模型設計的智能瀏覽器工具&#xff0c;目的是讓 AI 能夠像人類一樣自然地瀏覽和操作網頁。它支持多標簽頁管理、視覺識別、內容提取&#xff0c;并能記錄和重復執行特定動作。…

Vue--常用組件解析

綁定事件v-on和按鍵修飾符 v-on:click 表示在button元素上監聽click事件 簡寫&#xff1a;click enter space tab 按鍵修飾符 keyup是用戶松開按鍵才觸發 keydown是在用戶按下按鍵時立即觸發 代碼展示&#xff1a; <!DOCTYPE html><html lang"en" xml…

《JVM考古現場(十八):造化玉碟·用字節碼重寫因果律的九種方法》

"鴻蒙初判&#xff01;當前因果鏈突破十一維屏障——全體碼農修士注意&#xff0c;《JVM考古現場&#xff08;十八&#xff09;》即將渡劫飛升&#xff01;" 目錄 上卷陰陽交纏 第一章&#xff1a;混沌初開——JVM因果律的量子糾纏 第二章&#xff1a;誅仙劍陣改—…

前端vue 項目px轉為rem的自適應解決方案

postcss-pxtorem&#xff08;或是postcss-px2rem&#xff09; npm install postcss-pxtorem amfe-flexible --save-dev 在入口文件 main.js 中引入 amfe-flexible&#xff08;響應式適配&#xff09;&#xff1a; main.js import amfe-flexible // 自動設置 html 的 font-s…

基于時間序列分解與XGBoost的交通通行時間預測方法解析

一、問題背景與數據概覽 在城市交通管理系統中,準確預測道路通行時間對于智能交通調度和路徑規劃具有重要意義。本文基于真實道路傳感器數據,構建了一個結合時間序列分解與機器學習模型的預測框架。數據源包含三個核心部分: 道路通行數據(new_gy_contest_traveltime_train…

Day14:關于MySQL的索引——創、查、刪

前言&#xff1a;先創建一個練習的數據庫和數據 1.創建數據庫并創建數據表的基本結構 -- 創建練習數據庫 CREATE DATABASE index_practice; USE index_practice;-- 創建基礎表&#xff08;包含CREATE TABLE時創建索引&#xff09; CREATE TABLE products (id INT PRIMARY KEY…

【C++】繼承:萬字總結

&#x1f4dd;前言&#xff1a; 這篇文章我們來講講面向對象三大特性之一——繼承 &#x1f3ac;個人簡介&#xff1a;努力學習ing &#x1f4cb;個人專欄&#xff1a;C學習筆記 &#x1f380;CSDN主頁 愚潤求學 &#x1f304;其他專欄&#xff1a;C語言入門基礎&#xff0c;py…

Java 架構設計:從單體架構到微服務的轉型之路

Java 架構設計&#xff1a;從單體架構到微服務的轉型之路 在現代軟件開發中&#xff0c;架構設計的選擇對系統的可擴展性、可維護性和性能有著深遠的影響。隨著業務需求的日益復雜和用戶規模的不斷增長&#xff0c;傳統的單體架構逐漸暴露出其局限性&#xff0c;而微服務架構作…

Django3 - 開啟Django Hello World

一、開啟Django Hello World 要學習Django首先需要了解Django的操作指令&#xff0c;了解了每個指令的作用&#xff0c;才能在MyDjango項目里編寫Hello World網頁&#xff0c;然后通過該網頁我們可以簡單了解Django的開發過程。 1.1 Django的操作指令 無論是創建項目還是創建項…

2025阿里云AI 應用-AI Agent 開發新范式-MCP最佳實踐-78頁.pptx

2025阿里云AI 應用-AI Agent 開發新范式-MCP最佳實踐&#xff0c;包含以下內容&#xff1a; 1、AI 應用架構新范式 2、云原生API網關介紹 3、云原生API網關底座核心優勢 4、流量網關最佳實踐 5、AI 網關代理 LLM 最佳實踐 6、MCP網關最佳實踐 7、MSE Nacos MCP Server 注冊中心…

Pytorch深度學習框架60天進階學習計劃 - 第41天:生成對抗網絡進階(一)

Pytorch深度學習框架60天進階學習計劃 - 第41天&#xff1a;生成對抗網絡進階&#xff08;一&#xff09; 今天我們將深入探討生成對抗網絡(GAN)的進階內容&#xff0c;特別是Wasserstein GAN&#xff08;WGAN&#xff09;的梯度懲罰機制&#xff0c;以及條件生成與無監督生成…

大模型到底是怎么產生的?一文了解大模型誕生全過程

前言 大模型到底是怎么產生的呢? 本文將從最基礎的概念開始,逐步深入,用通俗易懂的語言為大家揭開大模型的神秘面紗。 大家好,我是大 F,深耕AI算法十余年,互聯網大廠核心技術崗。 知行合一,不寫水文,喜歡可關注,分享AI算法干貨、技術心得。 【專欄介紹】: 歡迎關注《…

五子棋(測試報告)

文章目錄 一、項目介紹二、測試用例三、自動化測試用例的部分展示注冊登錄游戲大廳游戲匹配 總結 一、項目介紹 本項目是一款基于Spring、SpringMVC、MyBatis、WebSocket的雙人實時對戰五子棋游戲,游戲操作便捷&#xff0c;功能清晰明了。 二、測試用例 三、自動化測試用例的…

idea開發工具多賬號使用拉取代碼報錯問題

設置git不使用憑證管理 把 use credential helper 取消勾選 然后重新pull代碼&#xff0c;并勾選remember 這樣就可以使用多賬號來連接管理代碼了

【OpenCV】【XTerminal】talk程序運用和linux進程之間通信程序編寫,opencv圖像庫編程聯系

目錄 一、talk程序的運用&Linux進程間通信程序的編寫 1.1使用talk程序和其他用戶交流 1.2用c語言寫一個linux進程之間通信&#xff08;聊天&#xff09;的簡單程序 1.服務器端程序socket_server.c編寫 2.客戶端程序socket_client.c編寫 3.程序編譯與使用 二、編寫一個…