英雄哥算法入门100讲-----第一讲幂和对数

幂和对数



2 的幂

题目链接

解题思路

解法1
首先小于等于 0 的数必然不是,1 必然是。在处理完这些边界之后,尝试将 n 除干净,如果最后剩余数值为 1 则说明该数是 2 的幂.

代码实现

public boolean isPowerOfTwo(int n) {
      if(n <= 0)return false;
      while(n % 2 == 0) n /= 2;
      return n == 1;
 }

解法二
一个数如果是 2 的指数,那么它的二进制表示一定只含有一个 1。位运算 n&(n-1) 在算法中挺常见的,作用是消除数字 n 的二进制表示中的最后一个 1,用这个技巧可以判断 2 的幂,如果是2的幂的说明只存在一个1,用n&(n-1)消除最后一个1,一定是等于0的,反之可以得出不是2的幂.
代码实现

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

3 的幂

题目链接

解题思路

解法1
首先小于等于 0 的数必然不是,1 必然是。在处理完这些边界之后,尝试将 n 除干净,如果最后剩余数值为 1 则说明该数是 3 的幂.

代码实现

public boolean isPowerOfThree(int n) {
        if(n <= 0)return false;
        while(n % 3 == 0 ) n /= 3;
        return n == 1;
    }

4 的幂

题目链接

解题思路

解法1
首先小于等于 0 的数必然不是,1 必然是。在处理完这些边界之后,尝试将 n 除干净,如果最后剩余数值为 1 则说明该数是 4的幂.

代码实现

public boolean isPowerOfFour(int n) {
        if(n <= 0) return false;
        while(n % 4 == 0) n /= 4;
        return n == 1;
    }

解法2
我们可以先对 n 执行 sqrt 函数,然后应用 lowbit 函数快速判断 n是否为 2 的幂。

代码实现

class Solution {
    public boolean isPowerOfFour(int n) {
        if (n <= 0) return false;
        int x = getVal(n);
        return x * x == n && (x & -x) == x;
    }
    int getVal(int n) {
        long l = 0, r = n;
        while (l < r) {
            long mid = l + r >> 1;
            if (mid * mid >= n) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        return (int)r;
    } 
}

(x & -x)当一个数与其取负后的值相与, 如果这个数是偶数, 则结果是能整除这个偶数的最大的2的幂(即: m = n & -n , 则 n % m = 0, 且 m = 2 ^ k), 如果这个数是奇数, 则结果必为1”
(x & -x)==x 一定是2的幂,一个为2的幂次的数用二进制表示一定只存在1个1.
在这里插入图片描述


总结

1.对于计算x是不是y的幂,最简单的实现方法就是解法1.
2.n&(n-1)可以消除n用来二进制来表示的最后1位1.
3.x&-x如果该数是2的幂就等于x,奇数x&-1等于1.
4.二分法来实现sprt()会进行向上取整,java自带的sprt()是向下取整.


最后

本文主要参考的三叶姐的题解链接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值