数学 -- 2的幂

307 阅读2分钟

一、题目描述

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

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/po…

示例 1:

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

示例 2:

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

示例 3:

输入:n = 3 输出:false

示例 4:

输入:n = 4 输出:true

示例 5:

输入:n = 5 输出:false

二、解法

2.1 循环

采用循环的方式,来依次将这个数据 %2 直到n等于1为止

class Solution {
    public boolean isPowerOfTwo(int n) {
        while(n > 1) {
            if(n % 2 == 1) {
                return false;
            }
            n /= 2;
        }
        if(n == 1) {
            return true;
        }
        return false;
    }
}

2.2 递归

采用递归的方式,将大问题化为小问题来进行求解

① 递归的结束条件

  • n == 0 return false
  • n == 1 return true ② 子问题
  • if(n % 2 != 0) return false
  • 继续判断: n / 2
class Solution {
    public boolean isPowerOfTwo(int n) {
        if(n == 1) {
            return true;
        }
        if(n == 0) {
            return false;
        }
	    if(n % 2 != 0) {
            return false;
        }
	    return isPowerOfTwo(n/2);
    }
}

2.3 位运算

对于2的幂次方而言,   都是 10000...000,     n个0
当它减去1后,这个数将会变成 1111.....111,     n-1个1
它们进行 &运算,结果将会变为0。

也就是,令 n & (n - 1),如果结果是0,说明是2的幂次方。

class Solution {
    public boolean isPowerOfTwo(int n) {
        return n > 0 && (n & (n - 1)) == 0;
    }
}

三、相似题目

给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false。

整数 n 是 4 的幂次方需满足:存在整数 x 使得 n == 4x

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/po…

题目分析

首先4的幂次方一定是2的幂次方n & (n - 1) == 0,其次4的幂次方满足n % 3 == 1,满足这两种条件说明是4的幂次方。

代码

class Solution {
    public boolean isPowerOfFour(int n) {
        return (n > 0) && ((n & (n-1)) == 0) && (n % 3 == 1);
    }
}