【C++刷題】優選算法——位運算

常見位運算操作總結:

  1. 基礎位運算
    &:有0則為0
    |:有1則為1
    ^:相同為0,相異為1 / 無進位相加
  2. 運算符的優先級
    管它什么優先級,加括號就完事兒了
  3. 給一個數 n,確定它的二進制表示中的第 i (默認是從右起第0位) 位是 0 還是 1
    (n >> i) & 1
  4. 將一個數 n 的二進制表示的第 i 位修改為 1
    n |= (1 << i)
  5. 將一個數 n 的二進制表示的第 i 位修改成 0
    n &= (~(1 << i))
  6. 提取一個數 n 二進制表示中最右側的 1 (lowbit操作)
    n & (-n)
    (-n) 將 n 最右側的 1 的 左邊的區域 全部變成了相反的位
  7. 干掉一個數 n 二進制表示中最右側的 1
    n &= (n - 1)
    (n - 1) 將 n 最右側的 1 的 右邊的區域(包括最右側的1),全部變成了相反的位
  8. 異或 ^ 運算的運算律
    n ^ 0 = n
    n ^ n = 0 - 消消樂
    a ^ b ^ c = a ^ (b ^ c)

根據第6、7條位運算操作,可以搞定1-3題。

  1. 位1的個數
int hammingWeight(int n)
{int ret = 0;while(n){++ret;n &= (n - 1);}return ret;
}
  1. 比特位計數
int hammingWeight(int n)
{int ret = 0;while(n){++ret;n &= (n - 1);}return ret;
}
vector<int> countBits(int n)
{vector<int> ret(n + 1);for(int i = 1; i <= n; ++i){ret[i] = hammingWeight(i);}return ret;
}
  1. 漢明距離
int hammingWeight(int n)
{int ret = 0;while(n){++ret;n &= (n - 1);}return ret;
}
int hammingDistance(int x, int y)
{int ret = 0;while(x && y){if((x & (-x)) < (y & (-y))){++ret;x &= (x - 1);}else if((x & (-x)) > (y & (-y))){++ret;y &= (y - 1);}else{x &= (x - 1);y &= (y - 1);}}ret += hammingWeight(x);ret += hammingWeight(y);return ret;
}

結合第 8 條位運算操作,可以搞定4-5題。
4. 只出現一次的數字

int singleNumber(vector<int>& nums)
{int ret = 0;for(int e : nums) ret ^= e;return ret;
}
  1. 只出現一次的數字 III
vector<int> singleNumber(vector<int>& nums)
{long long lowbit = 0;for(int e : nums) lowbit ^= e;lowbit &= (-lowbit);long long low_0 = 0, low_1 = 0;for(int e : nums){if(e & lowbit) low_1 ^= e;else low_0 ^= e;}return {(int)low_0, (int)low_1};
}
  1. 判定字符是否唯一
bool isUnique(string astr) 
{if(astr.size() > 26) return false;int hash = 0;for(char c : astr){int bit = 1 << (c - 'a');if( hash & bit ) return false;else hash |= bit;}return true;
}
  1. 丟失的數字
// 高斯求和
int missingNumber(vector<int>& nums)
{int n = nums.size();int sum = (0 + n) * (n + 1) / 2;for(int e : nums) sum -= e;return sum;
}// 異或 運算律
int missingNumber(vector<int>& nums)
{int n = nums.size();int ret = 0;for(int i = 0; i <= n; ++i) ret ^= i;for(int e : nums) ret ^= e;return ret;
}
  1. 兩整數之和
int getSum(int a, int b)
{while(b){int no_carry = a ^ b;int carry = (a & b) << 1;a = no_carry;b = carry;}return a;
}
  1. 只出現一次的數字 II
int singleNumber(vector<int>& nums)
{int ret = 0;for(int i = 0; i < 32; ++i){int num = 0;for(int e : nums) if( e & (1 << i) ) ++num;if(num % 3) ret |= (1 << i);}return ret;
}
  1. 消失的兩個數字
vector<int> missingTwo(vector<int>& nums)
{int n = nums.size();int N = n + 2;int num = 0;for(int i = 1; i <= N; ++i) num ^= i;for(int e : nums) num ^= e;int lowbit = num & (-num);int low_0 = 0, low_1 = 0;for(int i = 1; i <= N; ++i){if(i & lowbit) low_1 ^= i;else low_0 ^= i;}for(int e : nums){if(e & lowbit) low_1 ^= e;else low_0 ^= e;}return {low_0, low_1};
}

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

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

相關文章

【基本數據結構】平衡二叉樹

文章目錄 前言平衡二叉樹1 簡介2 旋轉2.1 左旋2.2 右旋2.3 何時旋轉 3 插入節點4 刪除節點5 代碼 參考資料寫在最后 前言 本系列專注更新基本數據結構&#xff0c;現有以下文章&#xff1a; 【算法與數據結構】數組. 【算法與數據結構】鏈表. 【算法與數據結構】哈希表. 【…

【斯坦福因果推斷課程全集】1_隨機對照試驗1

目錄 The average treatment effect Difference-in-means estimation IID Sampling and Population Asymptotics Example: The linear model Regression adjustments with a linear model 隨機對照試驗&#xff08;RCT&#xff09;是統計因果推論的基礎。如果有的話&#…

關于FPGA 使用SPI FLASH固化時如何配置固化參數

關于FPGA 使用SPI FLASH固化時如何配置固化參數 EDA工具&#xff1a;Vivado 關于FPGA 使用SPI FLASH固化時如何配置固化參數一、引言二、如何設置固化參數&#xff1a;使用50M的速度 &#xff0c;SPI為X4 &#xff0c;以及bit壓縮第一&#xff1a;點open implenment design第二…

Android之onMeasure的三種模式

Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}在 Android 中&#xff0c;onMeasure() 方法是 View 或 ViewGroup 中的一個重要方法&#xff0c;用于測量視圖的大小。在 onMeasure(…

安裝軟件缺少dll文件怎么辦,分享多種解決dll問題的方法

在計算機使用過程中&#xff0c;我們經常會遇到安裝軟件時提示缺少dll文件的問題。這種情況通常會導致軟件無法正常運行或啟動。為了解決這個問題&#xff0c;我總結了以下五種方法&#xff0c;希望對大家有所幫助。 一&#xff0c;了解DLL文件是什么 動態鏈接庫&#xff08;D…

簡單說說我對集成學習算法的一點理解

概要 集成學習&#xff08;Ensemble Learning&#xff09;是一種機器學習技術框架&#xff0c;它通過構建并結合多個學習器&#xff08;也稱為個體學習器或基學習器&#xff09;來完成學習任務。 集成學習旨在通過組合多個基學習器的預測結果來提高整體模型的性能。每個基學習…

常見儀表盤指示燈的含義,這次夠全了!

汽車是當前主要的交通工具之一&#xff0c;給人們的工作、生活提供了便利。大家在學會開車的同時&#xff0c;也得了解一些基本的汽車常識&#xff0c;可以及時的發現車輛的問題&#xff0c;并作出正確的判斷&#xff0c;以此降低車輛的損耗和維修成本。其中最基本的&#xff0…

房產證上加名?手把手教你操作,省錢又省心!

隨著《民法典》的實施&#xff0c;房產的權屬問題愈發受到重視。夫妻雙方及其親屬常希望能在房產證上增添自己的名字&#xff0c;以保障各自的權益。那么&#xff0c;房產證上到底能寫幾個名字呢&#xff1f;以下是對這一問題的詳細解答。 一、房產證命名無固定限制 在購房時&…

準確-K8s系列文章-修改containerd 默認數據目錄

修改 Kubernetes 集群中 containerd 默認數據目錄為 /data/containerd 前言 本文檔適用于 Kubernetes 1.24 及以上版本的集群,介紹如何將 containerd 默認的數據目錄從 /var/lib/containerd 修改為 /data/containerd。 步驟 1. 停止 containerd 服務(慎重!!!需評估風險!…

iOS中的UIScene和UISceneDelegate

目錄 ???????前言 一、AppDelegate和SceneDelegate的關系 1.AppDelegate 2.SceneDelegate 3.info.plist配置 4.生命周期方法對比 1.應用啟動 2.進入前臺 3.進入后臺 5.何時使用AppDelegate和SceneDelegate 1.AppDelegate 2.SceneDelegate 前言 在iOS 13及之…

Linux內核編程入門:深度探索與實戰挑戰

Linux內核編程入門&#xff1a;深度探索與實戰挑戰 在操作系統的心臟地帶&#xff0c;Linux內核以其強大、靈活和開源的特性吸引著眾多程序員。對于那些渴望深入了解系統底層機制并親手塑造操作系統的勇士們&#xff0c;Linux內核編程無疑是一個極具挑戰性和吸引力的領域。本文…

民國漫畫雜志《時代漫畫》第39期.PDF

時代漫畫39.PDF: https://url03.ctfile.com/f/1779803-1248636473-6bd732?p9586 (訪問密碼: 9586) 《時代漫畫》的雜志在1934年誕生了&#xff0c;截止1937年6月戰爭來臨被迫停刊共發行了39期。 ps: 資源來源網絡!

Qt for Android : 使用libusb做CH340x串口傳輸的底層USB庫

簡介 Qt for Android自帶的串口方案并沒有適用在高的API版本中&#xff0c; 會出現permission denied的訪問問題&#xff0c; 所以就需要使用Android API&#xff0c; 也就是在CPP中使用JNI方式進行調用&#xff0c; 為了開發的方便&#xff0c; 使用libusb庫作為替代的底層usb…

SpringBoot注解--10--@Bean,對象注入的三種方法

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 Bean一、如何使用方法注解注意Bean 的命名規則&#xff0c;當沒有設置 name 屬性時&#xff0c;那么 bean 默認的名稱就是方法名&#xff0c;當設置了 name 屬性之后…

解析Java中1000個常用類:Runnable 類,你學會了嗎?

在 Java 編程中,處理并發和多線程是一個重要的主題。為了簡化多線程編程,Java 提供了多種工具和類,其中最基本的一個工具就是 Runnable 接口。 Runnable 接口為創建和管理線程提供了一種標準的方式。本文將詳細介紹 Runnable 接口的定義、實現原理、應用場景,并通過示例展…

33【Aseprite 作圖】樹——拆解

1 樹葉 畫樹葉真累啊&#xff0c;可以先畫一個輪廓&#xff0c;細節一點點修 2 1 2 &#xff1b;2 2 2 &#xff08;橫著橫&#xff09;&#xff0c;這樣一點點畫樹葉 填充顏色&#xff0c;用了噴霧工具 2 樹干部分 輪廓部分&#xff0c;左邊的是3 3 3 &#xff1b;上下都是…

網頁音頻提取在線工具有哪些 網頁音頻提取在線工具下載

別再到處去借會員賬號啦。教你一招&#xff0c;無視版權和地區限制&#xff0c;直接下載網頁中的音頻文件。沒有復雜的操作步驟&#xff0c;也不用學習任何代碼。只要是網頁中播放的音頻文件&#xff0c;都可以把它下載到本地保存。 一、網頁音頻提取在線工具有哪些 市面上的…

【數據結構】二叉樹:簡約和復雜的交織之美

專欄引入&#xff1a; 哈嘍大家好&#xff0c;我是野生的編程萌新&#xff0c;首先感謝大家的觀看。數據結構的學習者大多有這樣的想法&#xff1a;數據結構很重要&#xff0c;一定要學好&#xff0c;但數據結構比較抽象&#xff0c;有些算法理解起來很困難&#xff0c;學的很累…

Transformer中的位置編碼PE(position encoding)

Transformer中的位置編碼PE(position encoding) 1.提出背景 transformer模型的attention機制并沒有包含位置信息&#xff0c;即一句話中詞語在不同的位置時在transformer中是沒有區別的 2.解決背景 給encoder層和decoder層的輸入添加了一個額外的向量Positional Encoding&a…

平移數據c++

題目描述 將a數組中第一個元素移到數組末尾,其余數據依次往前平移一個位置。 輸入 第一行為數組a的元素個數n&#xff1b; 第二行為n個小于1000的正整數。 輸出 平移后的數組元素&#xff0c;每個數用一個空格隔開。 樣例輸入 10 1 2 3 4 5 6 7 8 9 10 樣例輸出 2 3 …