leetcode 231. 2的冪

給定一個整數,編寫一個函數來判斷它是否是 2 的冪次方。

示例?1:

輸入: 1
輸出: true
解釋: 20?= 1
示例 2:

輸入: 16
輸出: true
解釋: 24?= 16
示例 3:

輸入: 218
輸出: false

本題思路轉載位運算的常用技巧:lowbit運算,包含lowbit公式、講解、證明

?

什么是lowbit運算?


lowbit(n)運算是一個位運算的常用技巧,本題就可以直接用lowbit運算解決。
它的作用是求出n在表示成二進制的時候,最右邊的1出現的位置對應的數。這么說有點晦澀,看倆例子就懂了,其實很簡單:

lowbit(4) = lowbit(100) = 100
lowbit(5) = lowbit(1001) = 1
lowbit(6) = lowbit(1010) = 10
lowbit公式
lowbit公式非常簡單:

lowbit(n) = n & -n


公式證明


大家需要有一點計算機組成原理的常識,具體的我這里就不詳述了,只簡單提一下。在計算機中,數據的存儲是以補碼的形式,對于補碼來說:

n >= 0: n的補碼就是它本身
n < 0: n的補碼為~n + 1,其中~n為n的反碼
我們可以通過一個通例來證明,假設n=101...1000,中間的數字省略,直到展示出最右邊的一個1。

lowbit(n) = n & -n = n & (~n + 1)
n = ? ? ?101...1000
~n = ? ? 010...0111
~n + 1 = 010...1000
因此lowbit(n) = n & (~n + 1) = 1000


本題的解答


知道了lowbit后,解決本題的思路就非常簡單了,一行代碼就可以解決。因為我們可以發現,2的整數冪都只包含一個1。換句話說n是2的整數冪,則lowbit(n) == n。

class Solution {public boolean isPowerOfTwo(int n) {return n > 0 && (n & -n) == n;}
}

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

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

相關文章

C++(STL):04---智能指針之weak_ptr

一、概念weak_ptr是一種不控制所指向對象生存期的智能指針&#xff0c;它指向一個shared_ptr管理的對象擁有“弱”共享的特點最重要的特點一個對象被多個shared_ptr類所指向時&#xff0c;就會擁有多個引用計數但是當weak_ptr指向一個shared_ptr類所指向的對象時&#xff0c;該…

C語言: const關鍵字與指針

const修飾指針的4種形式 const關鍵字,在C語言中用來修飾變量,表示這個變量是常量。const修飾指針有4種形式,區分清楚這4種即可全部理解const和指針。第一種:const int *p;第二種:int const *p;第三種:int * const p;第四種:const int * const p;ation ‘*p4’ // 第一種…

leetcode268. 缺失數字

給定一個包含 0, 1, 2, ..., n 中 n 個數的序列&#xff0c;找出 0 .. n 中沒有出現在序列中的那個數。 示例 1: 輸入: [3,0,1] 輸出: 2 示例 2: 輸入: [9,6,4,2,3,5,7,0,1] 輸出: 8 說明: 你的算法應具有線性時間復雜度。你能否僅使用額外常數空間來實現? 眾所周知&#…

C++(STL):07---vector之使用方式和常規用法

簡單兩三句話說下vector(一般領導講話都說簡單說兩句,結果說了一個鐘頭): 介紹 vector是表示可變大小數組的序列容器。就像數組一樣,vector也采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問,和數組一樣高效。但是又不像數組,它的大小是…

leetcode276. 柵欄涂色

有 k 種顏色的涂料和一個包含 n 個柵欄柱的柵欄&#xff0c;每個柵欄柱可以用其中一種顏色進行上色。 你需要給所有柵欄柱上色&#xff0c;并且保證其中相鄰的柵欄柱 最多連續兩個 顏色相同。然后&#xff0c;返回所有有效涂色的方案數。 注意: n 和 k 均為非負的整數。 示例…

C++(STL):11---vector源碼剖析

一、vector概述 vector的使用語法可以參考文章之前的幾篇文章,總的來說:vector是可變大小數組特點:支持快速隨機訪問。在尾部之外的位置插入或刪除元素可能很慢元素保存在連續的內存空間中,因此通過下標取值非常快在容器中間位置添加或刪除元素非常耗時一旦vector內存不足,…

C++(STL):09---vector迭代器失效問題

在vector中,我們經常會使用迭代器iterator對vector中的元素進行索引,也經常需要將迭代器作為參數傳遞到vector的成員函數中,迭代器使用非常方便,但使用不當也會給我們帶來巨大的麻煩,下面就深入分析vector迭代器失效的場景 push_back導致迭代器失效 Release模式下能正常…

leetcode278. 第一個錯誤的版本

你是產品經理&#xff0c;目前正在帶領一個團隊開發新的產品。不幸的是&#xff0c;你的產品的最新版本沒有通過質量檢測。由于每個版本都是基于之前的版本開發的&#xff0c;所以錯誤的版本之后的所有版本都是錯的。 假設你有 n 個版本 [1, 2, ..., n]&#xff0c;你想找出導…

C++(STL):08---vector元素訪問

本文將給大家帶來分享:vector中訪問元素和迭代器失效問題,這兩部分是在日常工作開發中經常遇到,也是容易犯錯的地方,同時也是在面試過程中經常被問到的。 1.訪問vector容器中單個元素 首先,vector 容器可以向普通數組那樣訪問存儲的元素,甚至對指定下標處的元素進行修改,…

leetcode253. 會議室 II

給定一個會議時間安排的數組&#xff0c;每個會議時間都會包括開始和結束的時間 [[s1,e1],[s2,e2],...] (si < ei)&#xff0c;為避免會議沖突&#xff0c;同時要考慮充分利用會議室資源&#xff0c;請你計算至少需要多少間會議室&#xff0c;才能滿足這些會議安排。 示例 …

C++(STL):10---vector空間分配

vector的數據安排以及操作方式,與array非常相似。兩者的唯一區別在于空間的運用的靈活性。array是靜態空間,一旦配置了就不能改變;要換個大(或小)一點的房子,可以,一切瑣細都得由客戶端自己來:首先配置一塊新空間,然后將元素從舊址一一搬往新址,再把原來的空間釋還給…

Struts1.x和Struts2.0的Action的區別

Struts1.x Struts2.0 1.接口&#xff1a; Struts1.x必須繼承org.apache.struts.action.Action或者其子類 Struts2.0無須繼承任務類型或實現任何接口 2.表單數據&#xff1a; Struts1.x表單數據封住在FormBean中 Struts2.0表單數據包含在Action中&#xff0c;通過Getter和…

C++(STL):15--- list源碼剖析

一、list概述 總的來說:環形雙向鏈表特點:底層是使用鏈表實現的,支持雙向順序訪問在list中任何位置進行插入和刪除的速度都很快不支持隨機訪問,為了訪問一個元素,必須遍歷整個容器與其他容器相比,額外內存開銷大設計目的:令容器在任何位置進行插入和刪除都很快何時使用:…

C++(STL):14--- forward_list比list更高效的容器

forward_list 是 C++ 11 新添加的一類容器,其底層實現和 list 容器一樣,采用的也是鏈表結構,只不過 forward_list 使用的是單鏈表,而 list 使用的是雙向鏈表(如圖 1 所示)。 圖 1 單鏈表( a) )和雙向鏈表( b) ) 圖 1 中,H 表示鏈表的表頭。 通過圖 1 不難看出,使用…

leetcode 190. 顛倒二進制位

顛倒給定的 32 位無符號整數的二進制位。 示例 1&#xff1a; 輸入: 00000010100101000001111010011100 輸出: 00111001011110000010100101000000 解釋: 輸入的二進制串 00000010100101000001111010011100 表示無符號整數 43261596&#xff0c; 因此返回 964176192&…

C++(STL):12--- list基本介紹

list 容器,又稱雙向鏈表容器,即該容器的底層是以雙向鏈表的形式實現的。這意味著,list 容器中的元素可以分散存儲在內存空間里,而不是必須存儲在一整塊連續的內存空間中。圖 1 展示了 list 雙向鏈表容器是如何存儲元素的。 圖 1 list 雙向鏈表容器的存儲結構示意圖 可以看到…

C++(STL):13--- list插入和訪問元素

前面章節介紹了如何創建 list 容器,在此基礎上,本節繼續講解如何向現有 list 容器中添加或插入新的元素。list 模板類中,與“添加或插入新元素”相關的成員方法有如下幾個: push_front():向 list 容器首個元素前添加新元素;push_back():向 list 容器最后一個元素后添加新…

leetcode266. 回文排列

給定一個字符串&#xff0c;判斷該字符串中是否可以通過重新排列組合&#xff0c;形成一個回文字符串。 示例 1&#xff1a; 輸入: "code" 輸出: false 示例 2&#xff1a; 輸入: "aab" 輸出: true 示例 3&#xff1a; 輸入: "carerac" 輸出…

Linux下MySQL忘記root密碼及解決辦法

第一步 修改MySQL的配置文件(默認為/etc/my.cnf),在配置文件的[mysqld]標簽下加入一行“skip-grant-tables”,并保存文件sudo vim /etc/my.cnf.d/mysql-server.cnf 第二步 重啟MySQL服務sudo service mysqld restart 第三步 輸入“mysql -u root -p”命令進入數據庫,…

MySQL -通過調整索引提升查詢效率

我們遇到的最容易引起困惑的問題就是索引列的順序。正確的順序依賴于使用該索引的查詢,并且同時需要考慮如何更好地滿足排序和分組的需要(順便說明,本節內容適用于B-Tree索引;哈希或者其他類型的索引并不會像B-Tree索引一樣按順序存儲數據)。在一個多列B-Tree索引中,索引…