生成n套數位加減乘除_leetcode 算法匯總(四)位運算

b8c0bc6f83e4e63e4f735d41065c0ef1.png

一、 運算符

  • & 與運算: 兩個位都是 1 時,結果才為 1,否則為 0
  • | 或運算: 兩個位都是 0 時,結果才為 0,否則為 1
  • ^ 異或運算: 兩個位相同則為 0,不同則為 1
  • ~ 取反運算:0 則變為 1,1 則變為 0
  • << 左移運算:向左進行移位操作,高位丟棄,低位補 0 (每左移一位相當于乘一次2)
  • >> 右移運算:向右進行移位操作,對無符號數,高位補 0,對于有符號數,高位補符號位 (每右移一位相當于除一次2)

二、 應用場景

^ 異或運算性質:

(1)交換律

(2)結合律(即(a^b)^c == a^(b^c))

(3)對于任何數x,都有x^x=0,x^0=x

(4)自反性 A ^ B ^ B = A ^ 0 = A

常見應用

  • 與運算的應用:(1)清零。如果想將一個單元清零,即使其全部二進制位為0,只要與一個各位都為零的數值相與,結果為零。 (2)取一個數中指定位
  • 或運算的應用: 對一個數的某幾位補1
  • 異或運算的應用: 消去一對重復的數(利用上面), 交換變量等等。
  • 取模: 位運算比加減乘除更加高效。 所以在一些底層的組件例如jdk, redis 中經常用位運算,比如用<< ,>>代替乘除, 用& 代替取模操作。
  • 狀態壓縮和位圖: 位運算可以用壓縮存儲和表示信息。 每個二進制位有0|1 兩種狀態, 那一個int32 可以表示出 32種狀態。 比如linux中的文件狀態中的read ,write, 和執行權限就可以用三個二進制位表示, 7(111)表示有Read的權限,有Write的權限和執行的權限。

三、 例題

1、 不使用中間變量交換兩數

// 思路: 利用上面提到的異或的結合率 和自反率
// a = (a ^ b) ^ b , b = a ^ b ^ a
void swap(int &a, int &b) {a ^= b;b ^= a;a ^= b;
}

2、 數組中,只有一個數出現一次,剩下都出現兩次,找出出現一次的數 (leetcode - 136)

    public int singleNumber(int[] nums) {int res = 0;for(int i = 0; i < nums.length; i++) {res = res ^ nums[i];}return res;}

3、 用 O(1) 時間檢測整數 n 是否是 2 的冪次 (LintCode - 142)

/** 思路: 常用技巧:n&(n-1)消去n 的二進制最后一位的1
* 比如3&(3-1) = (11)&(10) = (10) , 
* 如果是2的冪次, 那二進制形式下只有一位是1, 消去后為0
*/    public boolean checkPowerOf2(int n) {if(n <= 0) return false;return (n & (n - 1)) == 0;}

4、子集列舉 (leetcode - 78 medium)

描述:

Given a set of distinct integers, nums, return all possible subsets (the power set).

Note: The solution set must not contain duplicate subsets.

Example:

Input: nums = [1,2,3]
Output:
[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]
]

思路:(這道題遞歸做感覺也很容易理解)

注意數組中數字唯一,可以把這道題理解成高中數學中的排列組合問題。每個數字有取或不取兩種可能性, n個數有2的n次方個子集。 可以用一個正整數二進制表示的第i位是1還是0,代表集合的第i個數取或者不取。類似下圖:

0 000 {}
1 001 {1}
2 010 {2}
3 011 {1,2}
4 100 {3}
5 101 {1,3}
6 110 {2,3}
7 111 {1,2,3}

A:

    vector<vector<int>> subsets(vector<int>& nums) {int n = nums.size()int p = 1 << n;vector<vector<int>> subs(p);for (int i = 0; i < p; i++) {for (int j = 0; j < n; j++) {// 用 i>>j & 1的方式遍歷每一位if ((i >> j) & 1) {subs[i].push_back(nums[j]);}}}return subs;}

5、 位圖

描述:有一千萬個整數,整數范圍在1到1億之間, 如何快速查找某個整數是否在這1千萬個整數中。

思路: 用一個bit 數組來存儲這1-1億之間的數。如果數字存在, 在對應的下標上標1, 1億個數只需要1億個bit位。

public class BitMap { // Java 中 char 類型占 16bit,也即是 2 個字節private char[] bytes;private int nbits;public BitMap(int nbits) {this.nbits = nbits;this.bytes = new char[nbits/16+1];}public void set(int k) {if (k > nbits) return;int byteIndex = k / 16;int bitIndex = k % 16;bytes[byteIndex] |= (1 << bitIndex);}public boolean get(int k) {if (k > nbits) return false;int byteIndex = k / 16;int bitIndex = k % 16;return (bytes[byteIndex] & (1 << bitIndex)) != 0;}
}

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

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

相關文章

機器學習算法之 K-means、層次聚類,譜聚類

k-means 和層次聚類都屬于劃分聚類&#xff0c;實際中最常用的是k-means&#xff0c;k-means效果不好的情況下才會采用其他聚類 K-means算法 K-means算法&#xff0c;也稱為K-平均或者K-均值&#xff0c;是一種使用廣泛的最基礎的聚類算法 假設輸入樣本為TX1,X2,…,Xm;則算法…

vue數據請求

我是vue菜鳥&#xff0c;第一次用vue做項目&#xff0c;寫一些自己的理解&#xff0c;可能有些不正確&#xff0c;歡迎糾正。 vue開發環境要配置本地代理服務。把config文件加下的index.js里的dev添加一些內容&#xff0c; dev: {env: require(./dev.env),port: 8090,autoOpenB…

jetty部署多個web應用及將jetty配置成服務

通常情況下一個jetty部署一個java web應用&#xff0c;但一臺服務只部署一個應用可能會造成資源浪費&#xff0c;所以有時候可能在一臺服務器上要部署多個web應用。下面我們以一臺server部署兩個web應用為例。 服務器環境&#xff1a;安裝JDK&#xff0c;2個jetyy9 重點&#x…

程序員成長的10個階段

我的程序員成長之路 程序員的成長經歷往往很相似&#xff0c;大部分的人走過了最前面相同的一段路&#xff0c;而有的人則走得更遠。總結自己這些年來的歷程&#xff0c;這也許能讓年輕的程序員少走一些彎路&#xff0c;成長得更快&#xff1b;或許更好一些&#xff0c;能讓大家…

mapper注解的主要作用_Mybatis中mapper的xml解析詳解

上一篇文章分析了mapper注解關鍵類MapperAnnotationBuilder&#xff0c;今天來看mapper的項目了解析關鍵類XMLMapperBuilder。基礎介紹回顧下之前是在分析configuration的初始化過程&#xff0c;已經進行到了最后一步mapperElement(root.evalNode("mappers"))&#x…

機器學習之梯度下降法(GD)和坐標軸下降法(CD)

梯度下降法 梯度下降法&#xff08;Gradient Descent, GD&#xff09;常用于求解無約束情況下凸函數&#xff08;Convex Function&#xff09;的極小值&#xff0c;是一種迭代類型的算法&#xff0c;因為凸函數只有一個極值點&#xff0c;故求解出來的極小值點就是函數的最小值…

阿里云Https部署網站

0、開始之前 文章圖片很多&#xff0c;注意流量 首先你得準備好一個已經備案成功的域名&#xff0c;并且有一個在阿里云的服務器部署了的網站。 然后就是你迫切的希望升級網站為HTTPS部署。 那么我們開始吧&#xff01; 1、申請CA證書 1.1登錄阿里云控制臺&#xff0c;選擇菜單…

mysql數據庫多實例部署

本文系統&#xff1a;rhel5.8 ip : 192.168.100.150 數據庫版本&#xff1a;mysql-5.6.15 1、創建部署mysql服務賬號&#xff1a; 1234[rootdaf ~]# useradd -d /opt/mysql mysql [rootdaf ~]# echo "mysql" |passwd --stdin mysql Changing password for user mysq…

Python 第三方模塊之 numpy.linalg - 線性代數

目錄 numpy.linalg.det() 行列式 numpy.linalg.solve() 方程的解 numpy.linalg.inv() 逆矩陣 np.linalg.eig 特征值和特征向量 np.linalg.svd 奇異值分解 np.linalg.pinv 廣義逆矩陣&#xff08;QR分解&#xff09; numpy.linalg模塊包含線性代數的函數。使用這個模塊&am…

rabbitmq direct 多個消費者_一文解析 RabbitMQ 最常用的三大模式

Direct 模式所有發送到 Direct Exchange 的消息被轉發到 RouteKey 中指定的 Queue。Direct 模式可以使用 RabbitMQ 自帶的 Exchange: default Exchange&#xff0c;所以不需要將 Exchange 進行任何綁定(binding)操作。消息傳遞時&#xff0c;RouteKey 必須完全匹配才會被隊列接…

程序員成長最快的環境

除開五大或者ThoughtWorks這種要什么有什么&#xff0c;進去做打字也能光耀門楣的不談。如果是嫁到一個普通軟件公司&#xff0c;怎樣的環境才能最快的成長呢&#xff1f;首先基本的 公司項目管理水平是必要的&#xff1b;其次是穩健而不保守的公司技術選型和一班能溝通的同事。…

【BZOJ4254】Aerial Tramway 樹形DP

【BZOJ4254】Aerial Tramway 題意&#xff1a;給你一座山上n點的坐標&#xff0c;讓你在山里建m條纜車&#xff0c;要求纜車兩端的高度必須相等&#xff0c;且中間經過的點的高度都小于纜車的高度。并且不能存在一個點位于至少k條纜車的下方。求纜車的最大總長度。 n,m<200,…

C# 讀取保存App.config配置文件的完整源碼參考

最近出差在北京做一個小項目&#xff0c;項目里需要讀取配置文件的小功能&#xff0c;覺得挺有參考意義的就把代碼發上來給大家參考一下。我們選擇了直接用微軟的讀取配置文件的方法。 這個是程序的運行設計效果&#xff0c;就是把這些參數可以進行靈活設置&#xff0c;靈活保存…

TensorFlow 簡介

TensorFlow介紹 Tagline&#xff1a;An open-source software library for Machine Intelligence.Definition&#xff1a;TensorFlow TM is an open source software library fornumerical computation using data flow graphs.GitHub&#xff1a;https://github.com/tensorfl…

webbrowser設置為相應的IE版本

注冊表路徑&#xff1a; HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 或者HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BROWSER_EMULATION 究竟選擇哪一個…

jmeter壓力測試_用Jmeter實現對接口的壓力測試

一、多個真實用戶對接口的壓力測試1. 獲取多個真實用戶的token的兩種方法&#xff1a;1)第一種&#xff1a;讓開發幫忙生成多個token(多個用戶賬戶生成的token)&#xff0c;導出為csv格式的文件(以下步驟均以該方法為基礎)2)第二種&#xff1a;自己設置多個用戶賬戶和密碼&…

程序員成長之路(轉)

什么時候才能成為一個專業程序員呢&#xff1f;三年還是五年工作經驗&#xff1f;其實不用的&#xff0c;你馬上就可以了&#xff0c;我沒有騙你&#xff0c;因為專業程序員與業余程序員的區別主要在于一種態度&#xff0c;如果缺乏這種態度&#xff0c;擁有十年工作經驗也還是…

嵌入式開發——PWM高級定時器

學習目標 加強掌握PWM開發流程理解定時器與通道的關系掌握多通道配置策略掌握互補PWM配置策略掌握定時器查詢方式掌握代碼抽取優化策略掌握PWM調試方式學習內容 需求 點亮8個燈,采用pwm的方式。 定時器 通道 <

解決虛擬機時間引起的奇怪問題

一直使用得好好的虛擬機最近出了一個奇怪問題在虛擬機裝好的lamp在客戶端訪問phpmyadmin的時候,使用firefox登錄沒問題,但是使用IE不行總是停留在登錄的界面,而且沒有提供任何的出錯信息,就連在apache的日志里面也看不到.注意到同樣訪問的時候,在IE上顯示的轉向的url是[url]htt…

TensorFlow 基本操作

Tensorflow基本概念 圖(Graph):圖描述了計算的過程&#xff0c;TensorFlow使用圖來表示計算任務。張量(Tensor):TensorFlow使用tensor表示數據。每個Tensor是一個類型化的多維數組。操作(op):圖中的節點被稱為op(opearation的縮寫)&#xff0c;一個op獲得/輸入0個或多個Tensor…