热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

五分钟掌握高效算法:判断4的幂

深入探讨LeetCode上的一道经典算法题——判断一个整数是否为4的幂,提供高效解决方案。


欢迎关注“CSDN云计算”,获取更多技术资讯!

640?wx_fmt=jpeg


作者 | 程序员小吴

来源 | 五分钟学算法


题目源自 LeetCode 第 342 题:4 的幂。这是一道难度等级为 Easy 的题目,当前通过率为 45.3%。

题目描述

给定一个整数(32 位有符号整数),请编写一个函数来判断该整数是否为 4 的幂。

示例 1:

输入: 16 输出: true

示例 2:

输入: 5 输出: false

进阶挑战:能否在不使用循环或递归的情况下解决此问题?

解题思路

最直观的方法是不断除以 4,直到结果为 1 或者无法被 4 整除。然而,这种方法较为基础,下面介绍一种更为优雅的解法。

首先,4 的幂也必然是 2 的幂。我们可以通过观察 2 的幂的二进制形式,找出哪些是 4 的幂。例如,2 的幂包括 2 (10), 4 (100), 8 (1000) 等等,而 4 的幂则为 4 (100), 16 (10000), 64 (1000000) 等,它们的特点是二进制表示中的 1 始终位于奇数位。

十进制二进制
210
4100 (1 在第 3 位)
81000
1610000 (1 在第 5 位)
32100000
641000000 (1 在第 7 位)
12810000000
256100000000 (1 在第 9 位)
5121000000000
102410000000000 (1 在第 11 位)

基于这一规律,我们可以利用位运算来优化算法。具体来说,如果一个数是 2 的幂,那么它只有一个位是 1,其余位均为 0。因此,可以通过检查 n & (n - 1) 是否等于 0 来确定一个数是否为 2 的幂。接下来,为了确保这个数同时是 4 的幂,我们需要进一步验证这个 1 是否位于奇数位。为此,可以使用一个特殊的掩码 0x55555555(二进制 1010101010101010101010101010101),该掩码的奇数位为 1,偶数位为 0。通过与该掩码进行按位与运算,可以快速判断一个数是否为 4 的幂。

代码实现

class Solution { public boolean isPowerOfFour(int num) { if (num <= 0) return false; // 判断是否为2的幂 if ((num & (num - 1)) != 0) return false; // 判断1是否位于奇数位 if ((num & 0x55555555) == num) return true; return false; } }

640?wx_fmt=png

福利

扫描下方二维码,添加小编微信并备注“姓名+公司职位”,加入【云计算学习交流群】,与更多志同道合的朋友一起学习成长!

640?wx_fmt=jpeg

推荐阅读:

  • IEEE回应禁止华为系审稿人; WiFi联盟、蓝牙联盟已恢复华为成员资格;中国计算机学会:暂时中止与IEEE通信学会合作……

  • ARM发布新一代CPU和GPU,实现20%性能提升!

  • 前端开发20年变迁史

  • 北漂杭漂的程序员,是如何买到第一套房子?

  • “爱装X”开源组织:“教科书级”AI知识树究竟长什么样?

  • 500行Python代码打造刷脸考勤系统

  • 权游播完了, 你在骂烂尾, 有人却悄悄解锁了新操作……

640?wx_fmt=png真香,朕在看了!


推荐阅读
  • 本文详细介绍了如何在 EasyUI 框架中实现 DataGrid 组件的分页功能,包括配置方法和常见问题的解决方案。 ... [详细]
  • 本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。 ... [详细]
  • 本文详细介绍了Objective-C中的面向对象编程概念,重点探讨了类的定义、方法的实现、对象的创建与销毁等内容,旨在帮助开发者更好地理解和应用Objective-C的面向对象特性。 ... [详细]
  • 基于51单片机的多项目设计实现与优化
    本文探讨了基于51单片机的多个项目的设计与实现,包括PID控制算法的开关电源设计、八音电子琴仿真设计、智能抽奖系统控制设计及停车场车位管理系统设计。每个项目均采用先进的控制技术和算法,旨在提升系统的效率、稳定性和用户体验。 ... [详细]
  • 深入解析Java并发之ArrayBlockingQueue
    本文详细探讨了ArrayBlockingQueue,这是一种基于数组实现的阻塞队列。ArrayBlockingQueue在初始化时需要指定容量,因此它是一个有界的阻塞队列。文章不仅介绍了其基本概念和数据结构,还深入分析了其源码实现,包括各种入队、出队、获取元素和删除元素的方法。 ... [详细]
  • 本文将详细介绍如何配置并整合MVP架构、Retrofit网络请求库、Dagger2依赖注入框架以及RxAndroid响应式编程库,构建高效、模块化的Android应用。 ... [详细]
  • 本文汇集了作者在准备研究生入学考试过程中的心得体会,包括备考策略、复习重点及应对考试的心理调适技巧,旨在为即将参加考研的学生提供实用建议。 ... [详细]
  • 使用R语言进行Foodmart数据的关联规则分析与可视化
    本文探讨了如何利用R语言中的arules和arulesViz包对Foodmart数据集进行关联规则的挖掘与可视化。文章首先介绍了数据集的基本情况,然后逐步展示了如何进行数据预处理、规则挖掘及结果的图形化呈现。 ... [详细]
  • 在Android应用开发中,当在MenuItem中通过app:actionLayout属性使用Switch控件时,可能会遇到空指针异常的问题。本文将探讨该问题的原因及解决方案。 ... [详细]
  • A1166 峰会区域安排问题(25分)PAT甲级 C++满分解析【图论】
    峰会是指国家元首或政府首脑之间的会议。合理安排峰会的休息区是一项复杂的工作,理想的情况是邀请的每位领导人都是彼此的直接朋友。 ... [详细]
  • 2022年4月15日的算法练习题,包括最长公共子序列和线段树的应用。 ... [详细]
  • 本题要求计算从起点到终点所有最短路径的总权重,使用SPFA算法进行求解。 ... [详细]
  • 使用Pandas DataFrame探索十大城市房价与薪资对比
    在本篇文章中,我们将通过Pandas库中的DataFrame工具,深入了解中国十大城市的房价与薪资水平,探讨哪些城市的生活成本更为合理。这是学习Python数据分析系列的第82篇原创文章,预计阅读时间约为6分钟。 ... [详细]
  • 分布式计算助力链力实现毫秒级安全响应,确保100%数据准确性
    随着分布式计算技术的发展,其在数据存储、文件传输、在线视频、社交平台及去中心化金融等多个领域的应用日益广泛。国际知名企业如Firefox、Google、Opera、Netflix、OpenBazaar等均已采用该技术,推动了技术创新和服务升级。 ... [详细]
  • 来自FallDream的博客,未经允许,请勿转载,谢谢。一天一套noi简直了.昨天勉强做完了noi2011今天教练又丢出来一套noi ... [详细]
author-avatar
timer_open
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有