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.mzph.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索引中,索引…