【五分钟】看完一道有装逼解法的算法题


戳蓝字“CSDN云计算”关注我们哦!

640?wx_fmt=jpeg


作者 | 程序员小吴

来源 | 五分钟学算法


题目来源于 LeetCode 上第 342 号问题:4 的幂。题目难度为 Easy,目前通过率为 45.3% 。

题目描述

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

示例 1:

示例 2:

输入: 5
输出: false

进阶:
你能不使用循环或者递归来完成本题吗?

题目解析

这道题最直接的方法就是不停的去除以  4 ,看最终结果是否为 1 ,参见代码如下:

class Solution {
    public boolean isPowerOfFour(int num) {
         while ( (num != 0)  && (num % 4 == 0)) {
            num /= 4;
        }
        return num == 1;
    }
}

不过这段代码使用了 循环 ,逼格不够高。

对于一个整数而言,如果这个数是 4 的幂次方,那它必定也是 2 的幂次方。

我们先将 2 的幂次方列出来找一下其中哪些数是 4 的幂次方。

十进制二进制

2

10

4

100 (1 在第 3 位)

8

1000

16

10000(1 在第 5 位)

32

100000

64

1000000(1 在第 7 位)

128

10000000

256

100000000(1 在第 9 位)

512

1000000000

1024

10000000000(1 在第 11 位)

找一下规律: 4 的幂次方的数的二进制表示 1 的位置都是在奇数位

之前 在小吴的文章中判断一个数是否是 2 的幂次方数 使用的是位运算 n & ( n - 1 )。同样的,这里依旧可以使用位运算:将这个数与一个特殊的数做位运算。

这个特殊的数有如下特点:

  • 足够大,但不能超过 32 位,即最大为 31 个 1 

  • 它的二进制表示中奇数位为 1 ,偶数位为 0

符合这两个条件的二进制数是:

1010101010101010101010101010101

如果用一个 4 的幂次方数和它做与运算,得到的还是 4 的幂次方数

将这个二进制数转换成 16 进制表示:0x55555555 。有没有感觉逼格更高点。。。

640?wx_fmt=png

图片描述

640?wx_fmt=jpeg

代码实现

class Solution {
    public boolean isPowerOfFour(int num) {
        if (num <= 0)
            return false;
        //先判断是否是 2 的幂
        if ((num & num - 1) != 0)
            return false;
        //再判断如果进行与运算之后是否还是本身
        if ((num & 0x55555555) == num)
            return true;
        return false;
    }
}


640?wx_fmt=png

640?wx_fmt=jpeg

福利

扫描添加小编微信,备注“姓名+公司职位”,加入【云计算学习交流群】,和志同道合的朋友们共同打卡学习!


640?wx_fmt=jpeg


推荐阅读:

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

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

  • 前端开发 20 年变迁史

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

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

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

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523496.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业实战_03_Redis基础命令

接上一篇&#xff1a;企业实战_02_Redis基础 https://blog.csdn.net/weixin_40816738/article/details/99204244 先启动redis服务端&#xff0c;在启动redis客户端 说明命令info查看系统信息ping测试连通性dbsizekey数量keys *查看所有的keyselect 1切换到键空间(keyspace1)…

Docker精华问答 | Docker commit如何用?

Docker 是个划时代的开源项目&#xff0c;它彻底释放了计算虚拟化的威力&#xff0c;极大提高了应用的维护效率&#xff0c;降低了云计算应用开发的成本&#xff01;使用 Docker&#xff0c;可以让应用的部署、测试和分发都变得前所未有的高效和轻松&#xff01;1Q&#xff1a;…

java channel源码_Netty 4.0 源码分析(三):Channel和ChannelPipeline

Client和server通过Channel连接&#xff0c;然后通过ByteBuf进行传输。每个Channel有自己的Pipeline&#xff0c;Pipeline上面可以添加和定义Handler和Event。Channel类1 package io.netty.channel;2 import io.netty.buffer.ByteBuf;3 import io.netty.buffer.MessageBuf;4 im…

一拍即合、一见钟情之后,智慧城市的“福利”来啦……

戳蓝字“CSDN云计算”关注我们哦&#xff01;“未来双方的合作会针对智慧城市、智慧建筑以及智慧地域开发等领域开展创新型的解决方案&#xff0c;这种创造对于目前已经存在的&#xff0c;该领域技术甚至是竞争对手都是一个强大的震撼与颠覆。”达索系统董事会副主席兼首席执行…

Springboot部署到Tomcat,可以不带项目名进行访问

文章目录1. 进入tomcat的conf目录2. 编辑server.xml2.1. 修改第一处2.2. 修改第二处2.3. 发布war包2.4. 浏览器请求2.5. windows样例1. 进入tomcat的conf目录 cd /app/tomcat8081/conf/2. 编辑server.xml Tomcat9使用war包设置默认项目需要设置下server.xml就行 vim server.…

python ndarray append_9-Python-NumPy数组元素的添加与删除

数组元素的添加与删除 相关函数列表如下&#xff1a;函数元素及描述resize返回指定形状的新数组append将值添加到数组末尾insert沿指定轴将值插入到指定下标之前delete删掉某个轴的子数组&#xff0c;并返回删除后的新数组unique查找数组内的唯一元素1)返回指定大小的新数组num…

Java -jar 如何在后台运行项目

演示项目&#xff1a; GitHub链接&#xff1a;https://github.com/gb-heima/java-jar-nohup zip下载链接&#xff1a;https://github.com/gb-heima/java-jar-nohup/archive/master.zip git下载地址&#xff1a; git clone gitgithub.com:gb-heima/java-jar-nohup.git编译打包 …

裁员1700人,IBM 声称内部调整团队;谷歌将以26亿美元全现金收购Looker,绝对大手笔...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 贝索斯旗下蓝色起源将登月球…

修改Tomcat默认的端口

文章目录1. 进入/app/tomcat8081/conf&#xff0c;编辑server.xml文件2. 修改3个端口2.1. 第一个&#xff1a;停止端口&#xff0c;默认8005&#xff0c;修改为80062.2. 第二个&#xff1a;修改http访问端口&#xff0c;默认8080修改为80812.3. 第三个&#xff1a;修改APJ端口&…

Lambda 表达式有何用处?

戳蓝字“CSDN云计算”关注我们哦&#xff01;我们知道&#xff0c;对于一个Java变量&#xff0c;我们可以赋给其一个“值”。如果你想把“一块代码”赋给一个Java变量&#xff0c;应该怎么做呢&#xff1f;比如&#xff0c;我想把右边那块代码&#xff0c;赋给一个叫做aBlockOf…

Java Web项目_order下载、运行

项目简介&#xff1a; order为GitHub开源项目&#xff0c;作为java web测试的参考项目&#xff0c;可以快速编译打包运行&#xff0c;UI设计采用bootstrap页面美观&#xff01; 文章目录一、 order项目下载1.1. 项目链接&#xff1a;1.2. zip包下载链接&#xff1a;1.3. GitHub…

纯粹,极致!他用两个词阐释了UCloud

“我觉得有一个词是肯定的&#xff1a;纯粹&#xff0c;另一个词可能是极致。但这个词我有些犹豫&#xff0c;因为我们做的还不够好。”UCloud技术副总裁杨镭在UCloud用户大会期间接受老孙独家采访时这样形容UCloud。 UCloud技术副总裁杨镭关于UCloud&#xff1a;一家简单、纯粹…

java gc堆中的分区_jvm内存各个区域详解

内存区域划分Java虚拟机所管理的内存区域分为如下部分&#xff1a;方法区、GC堆、虚拟机栈、本地方法栈、PC程序计数器。其中方法区、GC堆是所有线程共享的&#xff1b;虚拟机栈、本地方法栈、PC程序计数器是各个线程独占的。image.pngPC程序计数器程序计数器可以看做是当前线程…

157 亿美元 !Salesforce 收购 Tableau !微软发布警告,表明黑客利用Office漏洞发动垃圾邮件攻击……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 荣耀在成都的全球首家Life概…

Git 远程配置_03

文章目录1. 生成SSH key 认证证书2. 查看公钥3. 拷贝公钥的内容&#xff0c;并设置到github中远程配置就是怎样和远程仓库建立连接? 1. 在本地生成公钥和私钥(认证证书) 2. 把本地生成的公钥复制到远程仓库的ssh key中保存1. 生成SSH key 认证证书 ssh-keygen -t rsa -C &qu…

Jenkins修改管理员密码

Jenkins的加密方式 Jenkins 的密码采用的是Java加解密工具 jBCrypt&#xff0c;我也是第一次接触到这种加密方式&#xff0c;实在被他惊叹到了&#xff01;这种加密方式每次加密同一个明文竟然都是得到不一样的结果&#xff0c;那他又是通过怎样的方式来解密的呢&#xff1f;原…

Storm精华问答 | 如何理解spout/bolt的生命周期?

戳蓝字“CSDN云计算”关注我们哦&#xff01;Storm是Twitter开源的分布式实时大数据处理框架&#xff0c;被业界称为实时版Hadoop。随着越来越多的场景对Hadoop的MapReduce高延迟无法容忍&#xff0c;比如网站统计、推荐系统、预警系统、金融系统等&#xff0c; 大数据实时处理…

刚刚!6月榜单:JS跌惨,Python又霸榜,C++再无翻身可能!

Python勇者无敌&#xff01;最近一份PYPL 6月报告了来了&#xff0c;通过半年的发展&#xff0c;Python基本已奠定2019年-2020的地位&#xff0c;持续称王就对了&#xff01;PLPY 6月榜单&#xff0c;JS跌惨只见Python笑&#xff0c;哪闻C哭PYPL 发布 6 月编程语言指数榜啦。毫…

java vector 输出_5.7(java学习笔记)Vector、Enumeration

一.VectorVector类实现一个可扩展的数组对象。与数组一样&#xff0c;它包含可以使用整数索引访问。它的基本操作方法add(int index, E element)&#xff0c;get(int index)&#xff0c;indexOf(Object o)等操作方法与数组中的方法类似这里就不叙述了。我们主要看一个方法&…

企业实战案例01_Jenkins_连接远程执行shell脚本

文章目录一、Jenkins 远程连接执行shell脚本1.1. 新建节点1.2. 配置节点信息二、连接远程验证测试2.1. 创建任务2.2. 添加注释2.3. 设置最大构建数量2.4. 限制项目的运行节点2.5. 选择构建环境2.6. 填写获取Tomact目录列表脚本2.7. 立即构建项目2.8. 查看控制台日志监控一、Jen…