0
点赞
收藏
分享

微信扫一扫

2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码

文章目录

  • ​​0 效果​​
  • ​​1题目​​
  • ​​3 代码​​
  • ​​3.1 2 的幂​​
  • ​​3.2 3 的幂​​
  • ​​3.3 4的幂​​

0 效果

2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码_i++

1题目

231. 2 的幂    
给你一个整数 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改成了3或者4。

3 代码

3.1 2 的幂

法1(暴力枚举):

注意边界。

class Solution {
public:
int kthFactor(int n, int k) {
int index = 1;
for(int i = 1;i <= n;i++){
if(n % i == 0){
if(k == index) return i;
index++;
}
}
return -1;
}
};

下面的方法摘自与​​leetcode官网​​:

法2(位运算):

一个数 n 是 22 的幂,当且仅当 n 是正整数,并且 n 的二进制表示中仅包含 1 个 1。

判断n是2次幂的方法为:​​n & (-n) == n​​​或​​n & (n-1) == 0​​ 。(负数是按补码存储)

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

法3:

在题目给定的 32 位有符号整数的范围内,最大的 2 的幂为2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码_i++_02。我们只需要判断 n 是否是2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码_官网_03 的约数即可。

class Solution {
private:
static constexpr int BIG = 1 << 30;

public:
bool isPowerOfTwo(int n) {
return n > 0 && BIG % n == 0;
}
};

3.2 3 的幂

法1:

暴力枚举:

class Solution {
public:
bool isPowerOfThree(int n) {
if(n <= 0) return false;
if(n == 1) return true;
uint k = 1;
for(int i = 1; i <= 20;i++){
k *= 3;
if(k == n){
return true;
}
}
return false;
}
};

下面的方法摘自与​​leetcode官网​​:

法2:

只需要判断是否为最大 33 的幂的约数。在题目给定的 32 位有符号整数的范围内,最大的 3 的幂为2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码_官网_04。我们只需要判断 n 是否是2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码_leetcode_05 的约数即可。

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

法3:

试除法:不断地将 n 除以 3,直到 ​​n=1​​。如果此过程中 nn 无法被 3 整除,就说明 n 不是 3 的幂。

class Solution {
public:
bool isPowerOfThree(int n) {
while (n && n % 3 == 0) {
n /= 3;
}
return n == 1;
}
};

3.3 4的幂

法1:

暴力枚举

class Solution {
public:
bool isPowerOfFour(int n) {
if(n == 0) return false;
if(n == 1) return true;
if(n == INT_MIN) return false;
uint k = 1, cycle = 1;
while(cycle < 32){
if((k<<cycle<<cycle) == n){
return true;
}
cycle++;
}
return false;
}
};

下面的方法摘自与​​leetcode官网​​:

法2:

如果 n 是 4 的幂,那么 n 的二进制表示中有且仅有一个 1,并且这个 1 出现在从低位开始的第偶数个二进制位上(这是因为这个 1 后面必须有偶数个 0)。这里我们规定最低位为第 0 位,例如 n=16 时,n 的二进制表示为(10000)2

由于题目保证了 nn 是一个 32 位的有符号整数,因此我们可以构造一个整数 mask,它的所有偶数二进制位都是 0,所有奇数二进制位都是 1。这样一来,我们将 n 和mask 进行按位与运算,如果结果为 0,说明 n 二进制表示中的 1 出现在偶数的位置,否则说明其出现在奇数的位置。

2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码_i++_06

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

法3:
思路与算法

如果 n 是 4 的幂,那么它可以表示成 2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码_i++_07 的形式,我们可以发现它除以 3 的余数一定为 11,即:
2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码_leetcode_08

如果 n是 2 的幂却不是 4 的幂,那么它可以表示成2、3、4的幂(对应leetcode的231、326、342题)————附解析和详细代码_leetcode_09的形式,此时它除以 3 的余数一定为 2。

因此我们可以通过 n 除以 3 的余数是否为 1 来判断 n 是否是 4 的幂。

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

举报

相关推荐

0 条评论