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


推荐阅读
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 深入解析:手把手教你构建决策树算法
    本文详细介绍了机器学习中广泛应用的决策树算法,通过天气数据集的实例演示了ID3和CART算法的手动推导过程。文章长度约2000字,建议阅读时间5分钟。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • 本文探讨了卷积神经网络(CNN)中感受野的概念及其与锚框(anchor box)的关系。感受野定义了特征图上每个像素点对应的输入图像区域大小,而锚框则是在每个像素中心生成的多个不同尺寸和宽高比的边界框。两者在目标检测任务中起到关键作用。 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
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社区 版权所有