【手把手带你刷LeetCode】——01.2的幂

简介: 01.2的幂

目录

原题:2的幂

方法一:位运算

方法二:判断n是否为最大2的幂的约数

总结



【声明】:这是一道关于位运算的题目哦,只不过不像原来那么死板,之后的题目中出现一题多解情况是很正常的事情哦。这里,麻烦大家先将原来关于位运算的基础知识点再过一遍。


蓝桥杯算法竞赛系列第一章——位运算的奇巧淫技及其实战_安然无虞的博客-CSDN博客


【前言】今天是第一次LeetCode刷题打卡哦,铁汁们都到了咩,准备上车咯。


原题:2的幂

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

示例1:


1. 输入:n = 1
2. 输出:true
3. 解释:20 = 1

 

示例2:


1. 输入:n = 3
2. 输出:false


思考:本题除了利用位运算解决,还有没有别的方法了?


方法一:位运算

整数n是2的幂,则一定满足两个条件:

  • 恒有n & (n - 1) == 0
  • 一定满足 n > 0


解释:1、为什么说n是2的幂就恒有n & (n - 1) == 0 呢,因为n的二进制最高位是1,其余位是0;(n - 1)的二进制最高位是0,其余位是1


注意:这里所说的最高位不是理论上的最高位,什么是理论上的最高位呢?


//整数2:
00000000 00000000 00000000 00000010


它的理论上的最高位是最左边的0,通常我们也叫它符号位。

但是我们在实际操作当中,不会去把32位上面每一位的数字都写出来,就好比:


//整数2:
10


直接用10就代表2的二进制表示形式了。所以它的最高位就是1了,这个也就是我这里所说的“最高位”的意思。

2、为什么说n > 0 呢?因为2的幂一定是大于0的,如果不加上程序就执行不过去了。你看:


bool isPowerOfTwo(int n){
    return n & (n - 1) == 0;
}


执行结果:



虽然通过了绝大部分测试用例,但是还是少考虑了个别边界,所以一定要注意哦。

代码执行:


bool isPowerOfTwo(int n){
    if(n > 0 && (n & (n - 1)) == 0){
        return true;
    }
    return false;
}


不过这里其实是可以简化代码的,将上面的三行代码化为一行:


bool isPowerOfTwo(int n){
    return n > 0 && ((n & (n - 1)) == 0);
}

 

【敲黑板】:铁汁们一定要注意优先级,没有必要说把每一个运算符优先级都记住,反正我是记不住,也不会花时间去记它,当我们不确定的时候加上括号就行了,注意一定要学会加括号哦,可能因为你少加或者是多加一个括号程序都会报错!


执行结果:


​通过
执行用时:0 ms, 在所有 C 提交中击败了100.00%的用户
内存消耗:5.3 MB, 在所有 C 提交中击败了83.80%的用户通过测试用例:1108 / 1108


 


好,这题其实很明显是用位运算解决的,但是再仔细想想有没有别的方法了呢?其实是有的...

方法二:判断n是否为最大2的幂的约数

除了利用位运算外,还有一种比较取巧的方法:

在题目给定的32位有符号整数的范围内,最大的2的幂为2 ^ 30 = 1073741824。我们只需要判断 n 是不是 2 ^ 30的约数即可。

这里我们补充一下有符号整数和无符号整数的范围:


有符号整数:int :32位,最高位是符号位,剩下31位是数值位,所以取值范围是 -(2 ^ 31) ~ 2 ^ 31 - 1 ,即为 -2147483648 ~ 2147483647(20亿)


无符号整数:unsigned int:32位,没有符号位,32位全部是数值位,所以取值范围是2 ^ 32 - 1,即为4294967295(40亿)


大家知道这个概念就好做了。

代码执行:

bool isPowerOfTwo(int n){
    int Big = 1 << 30;//扩大至 2 ^ 30
    return n > 0 && (Big % n == 0);
}


执行结果:


通过
执行用时:0 ms, 在所有 C 提交中击败了100.00%的用户
内存消耗:5.3 MB, 在所有 C 提交中击败了90.46%的用户通过测试用例:1108 / 1108


总结

  • 今天是力扣打卡第一天!笔者非常兴奋!!
  • 前期的话,因为题目比较简单,笔者主要采用C语言编写程序,到了中后期,就会采用C,C++解题
  • 今天的刷题你是否有所收获呢,欢迎评论区留言点评,咱们明天再见!


相关文章
|
SQL 数据库
SQL面试50题------(初始化工作、建立表格)
这篇文章提供了SQL面试中可能会遇到的50道题目的建表和初始化数据的SQL脚本,包括学生、教师、课程和成绩表的创建及数据插入示例。
SQL面试50题------(初始化工作、建立表格)
|
自然语言处理 Java 数据库连接
掌握JSP页面编程:动态生成Web内容
【4月更文挑战第3天】Java Server Pages (JSP) 是一种用于创建动态Web内容的Java技术,它结合HTML并允许在页面中嵌入Java代码。JSP支持代码片段、表达式语言(EL)和JSTL标签库,简化动态内容生成。当服务器接收到请求时,执行JSP中的Java代码并将结果嵌入HTML返回给客户端。示例展示了如何显示当前日期和时间。JSP可与Servlet、JavaBeans、数据库等结合,用于构建功能丰富的交互式Web应用。
321 5
掌握JSP页面编程:动态生成Web内容
|
存储 边缘计算 对象存储
阿里云盘正式公测
今天,我们的第一款个人云产品——阿里云盘,正式启动公测
5023 0
阿里云盘正式公测
|
2月前
|
JSON 算法 安全
淘宝商品详情API接口系列,json数据返回
淘宝开放平台提供了多种API接口用于获取商品详情信息,主要通过 淘宝开放平台(Taobao Open Platform, TOP) 的 taobao.tbk.item.info.get(淘宝客商品详情)或 taobao.item.get(标准商品API)等接口实现。以下是关键信息及JSON返回示例:
|
9月前
|
人工智能 资源调度 自然语言处理
《探秘:人工智能算法与鸿蒙Next携手赋能元宇宙高并发用户交互》
在元宇宙的宏大蓝图中,高并发用户交互是实现沉浸式体验的关键。鸿蒙Next通过分布式架构、微内核优化、智能场景感知和ArkTS语言等技术,使人工智能算法能高效适配,实现计算资源的最优利用,支持大规模多人在线游戏、商务会议等场景下的流畅交互,推动元宇宙产业蓬勃发展。
186 17
|
10月前
提升个人工作技能
提升个人工作技能
1095 6
|
11月前
|
机器学习/深度学习 人工智能 物联网
2024年软件开发趋势
【10月更文挑战第29天】本文概述了2024年软件开发领域的五大新趋势,涵盖人工智能与机器学习的深入整合、JAMstack架构的广泛采纳、对网络安全的强化关注、远程办公模式的持续影响,以及物联网技术的迅速扩张。这些趋势不仅反映了技术的进步,也展示了软件开发行业对效率、安全性和用户体验的不断追求。
|
10月前
|
存储 安全 编译器
封装、继承与多态究极详解
本文详细介绍了面向对象编程中的三大核心特性:封装、继承和多态。封装通过隐藏数据和提供接口,确保对象的安全性和一致性;继承通过类之间的“is-a”关系实现代码复用和扩展;多态则允许不同类的对象通过相同的接口执行不同的操作,增强程序的灵活性和可扩展性。文章还探讨了这些特性的底层实现机制,如虚函数表和内存布局,并提供了具体的代码示例。
486 0
|
搜索推荐 机器人 云计算
纳米机器人:医疗领域的微型革命与精准治疗
【9月更文挑战第16天】随着科技的飞速发展,纳米技术成为推动多个领域变革的重要力量。在医疗领域,纳米机器人以其独特优势引领着微型革命与精准治疗新时代。本文探讨其在药物输送、癌症治疗、手术辅助及疾病诊断中的应用,并分析其小型化、精准化、智能化与综合化的优势。尽管面临制造技术、体内控制等挑战,但随着科技的进步,纳米机器人有望成为人类健康的重要保障。
731 10
|
算法 安全 数据中心
BGP MD5认证的原理与实现
【7月更文挑战第15天】
259 3
BGP MD5认证的原理与实现