算法零基础学习leetcode 231326324题解

Posted 过气老学长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法零基础学习leetcode 231326324题解相关的知识,希望对你有一定的参考价值。

2的幂

问题描述

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

解决方案一:换底公式

class Solution {
    public boolean isPowerOfTwo(int n) {
        if(n == 0)  return false;
       int x = (int)(Math.log(n)/Math.log(2));
       if(Math.pow(2,x) == n){
           return true;
       }else{
           return false;
       }
    }
}

解决方案二:位运算

2的幂的二进制结果有且仅有一个1,所以,可以使用n & (n - 1)公式将这个1给去除,最终的结果为0。

序号2x二进制表示
010001
120010
240000 0100
380000 1000
4160001 0000
class Solution {
    public boolean isPowerOfTwo(int n) {
        return n > 0 && (n & (n -1)) == 0;
    }
}

解决方案三:判断是否为最大幂值的约数

因为规定了n的有效范围是-2^31^~2^31^-1,所以,幂的最大值是230 = 1073741824。只要n是这个值的约数,那么这个值一定是2的幂。

class Solution {
    public boolean isPowerOfTwo(int n) {
    		int max = 1073741824
        return n > 0 && max % n == 0;
    }
}

3的幂

问题描述

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

解决方案:判断是否为最大幂值的约数

class Solution {
    public boolean isPowerOfThree(int n) {
        return n>0 && 1162261467 % n == 0;	//1162261467是在n范围内的最大幂值
    }
}

4的幂

问题描述

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

解决方案一:暴力求解

如果n是4的幂,那么不断地对n做取余和整除运算,最终得到的结果都是1。

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

        return n == 1;
    }
}

解决方案二:位运算

和2x一样,4x的二进制表示同样只有一个1。所以,可以使用n & (n - 1)进行位运算。

return n > 0 && (n & (n - 1)) == 0;

但是,仅仅这样无法得到正确的结果——因为当n = 2x且n ≠ 4x时,返回的结果仍然是true

再仔细查看 4x 的二进制,可以发现其只有奇数位是1,所以,可以定义一个mask值来进行位运算

序号4x二进制表示
010001
140100
2160001 0000
3640100 0000
42560001 0000 0000
	mask = 0b10101010101010101010101010101010;

或者用一个十六进制数进行表示

	mask = 0xaaaaaaaa;

最终代码

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

以上是关于算法零基础学习leetcode 231326324题解的主要内容,如果未能解决你的问题,请参考以下文章

算法零基础学习关于二维数组的一些基础练习题 | leetcode1672158283248题解

算法零基础学习关于二维数组的一些基础练习题 | leetcode1672158283248题解

算法零基础学习关于二维数组的一些基础练习题 | leetcode1672158283248题解

算法零基础学习leetcode 867:转置矩阵 「题解」

算法零基础学习leetcode 867:转置矩阵 「题解」

算法零基础学习leetcode 867:转置矩阵 「题解」