算法通关村第十三关白银挑战——幂运算问题解析

大家好,我是怒码少年小码。

今天的主题是幂运算。LeetCode中主要是判断一个数是不是某一个正整数的整数次幂。

2 的幂

LeetCode 231:给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。

示例 1:

  • 输入:n = 1
  • 输出:true
  • 解释:2^0 = 1

示例 2:

  • 输入:n = 16
  • 输出:true
  • 解释:2^4 = 16

方法一:用除的方法

逐步缩小的方法是如果n 是 2的幂,则 n >0,且存在非负整数k使得 n = 2 ^k

  • 首先判断n是否是正整数,如果n是0 或负整数,则n一定不是2的幂
  • 然后为了判断n是否是2的幂,可以连续对n进行除以2的操作,直到n不能被2整除。此时如果n = 1(最后2/2一定等于1),则n是2的幂,否则n不是2的幂。
bool isPowerOfTwo(int n) {
    if(n <= 0){
        return false;
    }
    //如果n还是偶数就让他一直除于2,例
    while(n % 2 ==0){
        n /= 2;
    }
    return n == 1;
}

方法二:采用位运算

思路与统计数字转换成二进制数之后1的个数一致

如果正整数是2 的幂,当且仅当n的二进制表示中只有最高位是1,其余位都是0,此时满足 n & (n - 1) = 0。

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

3 的幂

LeetCode 326:给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3x

示例 1:

  • 输入:n = 27
  • 输出:true

示例 2:

  • 输入:n = 0
  • 输出:false

这道题用除法的方法就是换汤不换药。但是是否能优化一下:

输入的n是int类型,最大值是2^31 -1。不超过231-1的3的幂次方是319=1162261467。所以int范围内只要是3的幂次数,那么它一定是1162261467的除数,所以一次就可以判断。

bool isPowerOfThree(int n){
  return n > 0 && 1162261467 % n ==0; 
}

你可能感兴趣的:(算法学习,算法)