当前位置: 首页 > news >正文

LeetCode 0231. 2 的幂

【LetMeFly】231.2 的幂

力扣题目链接:https://leetcode.cn/problems/power-of-two/

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

如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。

 

示例 1:

输入:n = 1
输出:true
解释:20 = 1

示例 2:

输入:n = 16
输出:true
解释:24 = 16

示例 3:

输入:n = 3
输出:false

示例 4:

输入:n = 4
输出:true

示例 5:

输入:n = 5
输出:false

 

提示:

  • -231 <= n <= 231 - 1

 

进阶:你能够不使用循环/递归解决此问题吗?

方法一:位运算 + 负数特判

如果一个数是2的幂,那么这个数的二进制表示中只有一个1,其余全是0。

因此,我们只需要统计 n n n在二进制下的 1 1 1的个数即可。

注意: n n n是负数的时候,C++中算术右移,什么时候都不会变成0(最终会变成-1(每一位都是1))。

如果想要逻辑右移,那么需要把int转为unsigned int。

  • 时间复杂度 O ( log ⁡ n ) O(\log n) O(logn)
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if (n < 0)
            return false;
        int cnt1 = 0;
        while (n) {
            if (n & 1)
                cnt1++;
            n >>= 1;
        }
        return cnt1 == 1;
    }
};

方法二:转为unsigned int + INT_MIN特判

32位整数的最小数为 − 2 31 − 1 -2^{31}-1 2311,其二进制(补码表示)为1000 0000 0000 0000 0000 0000 0000 0000

原因是: 2 31 2^{31} 2311000 0000 0000 0000 0000 0000 0000 0000

补码 = 原码最高位为1,其余位取反再加一

最高位不变,其余位取反:1111 1111 1111 1111 1111 1111 1111 1111

其余位加一:111 1111 1111 1111 1111 1111 1111 1111 + 1= 1000 0000 0000 0000 0000 0000 0000 0000

首位的1溢出了,最终补码为1000 0000 0000 0000 0000 0000 0000 0000

也就是说,有且仅有这一个32位负整数,二进制下只有1个1。

因此,转为unsigned int的话,需要特判一下是否为IINT_MIN

AC代码

C++

class Solution {
public:
    bool isPowerOfTwo(unsigned int n) {
        if (n == INT_MIN)
            return false;
        int cnt1 = 0;
        while (n) {
            if (n & 1)
                cnt1++;
            n >>= 1;
        }
        return cnt1 == 1;
    }
};

如果觉得修改参数类型不好,也可:

class Solution {
public:
    bool isPowerOfTwo(int n) {
		unsigned int un = n;
        if (un == INT_MIN)
            return false;
        int cnt1 = 0;
        while (un) {
            if (un & 1)
                cnt1++;
            un >>= 1;
        }
        return cnt1 == 1;
    }
};

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/126766929

相关文章:

  • 【LeetCode】螺旋矩阵旋转图像
  • 猿创征文|网络原理——UDP/TCP协议
  • 理论第七课——sort
  • PyCharm利用pydevd-pycharm实现Python远程调试
  • Mysql中DQL(查询类)语句的执行顺序
  • CMake Tutorial 巡礼(2)_添加库
  • java毕业设计蛋糕店会员系统Mybatis+系统+数据库+调试部署
  • IntelliJ IDEA中构建Spring Boot的项目
  • 计算机视觉项目-实时目标追踪
  • 初始数据结构
  • Qt5开发从入门到精通——第六篇一节( 图像与图片——位置相关函数 )
  • 最新版校园招聘进大厂系列----------(5)百度篇 -----未完待续
  • 计算机网络——物理层(互联网接入技术)
  • IntegralUI Web 22.3组件
  • 细说卷积神经网络(CNN)中所谓的“感受野”(Receptive Field)
  • ➹使用webpack配置多页面应用(MPA)
  • happypack两次报错的问题
  • Invalidate和postInvalidate的区别
  • jdbc就是这么简单
  • JWT究竟是什么呢?
  • python_bomb----数据类型总结
  • scala基础语法(二)
  • spring boot 整合mybatis 无法输出sql的问题
  • Theano - 导数
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 高程读书笔记 第六章 面向对象程序设计
  • 缓存与缓冲
  • 前端之React实战:创建跨平台的项目架构
  • 如何选择开源的机器学习框架?
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • 组复制官方翻译九、Group Replication Technical Details
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #pragma data_seg 共享数据区(转)
  • #控制台大学课堂点名问题_课堂随机点名
  • (145)光线追踪距离场柔和阴影
  • (2.2w字)前端单元测试之Jest详解篇
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • *上位机的定义
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .NET 的程序集加载上下文
  • .net反混淆脱壳工具de4dot的使用
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .NET中两种OCR方式对比
  • .sh 的运行
  • .so文件(linux系统)
  • @GlobalLock注解作用与原理解析
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [3D基础]理解计算机3D图形学中的坐标系变换