热门标签 | 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真香,朕在看了!


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 深入解析JVM垃圾收集器
    本文基于《深入理解Java虚拟机:JVM高级特性与最佳实践》第二版,详细探讨了JVM中不同类型的垃圾收集器及其工作原理。通过介绍各种垃圾收集器的特性和应用场景,帮助读者更好地理解和优化JVM内存管理。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文基于刘洪波老师的《英文词根词缀精讲》,深入探讨了多个重要词根词缀的起源及其相关词汇,帮助读者更好地理解和记忆英语单词。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 探讨一个显示数字的故障计算器,它支持两种操作:将当前数字乘以2或减去1。本文将详细介绍如何用最少的操作次数将初始值X转换为目标值Y。 ... [详细]
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社区 版权所有