2、3、4的幂
2016-05-13 23:21
281 查看
Given an integer (signed 32 bits), write a function to check whether it is a power of 2.
Example:
Given num = 16, return true. Given num = 5, return false.
Follow up: Could you solve it without loops/recursion? https://leetcode.com/problems/power-of-two/ https://leetcode.com/problems/power-of-three/
https://leetcode.com/problems/power-of-four/
常规解法:
直接进行除法运算,如果能整除,则返回真,否则返回假。
把M分别换成2,3,4,即可AC。
算法一:
class Solution {
public:
bool isPowerOfTwo(int n) {
const int M = 2;
if (n < 1)
return false;
if (n == 1)
return true;
while (n % M == 0 && n > M)
n /= M;
return n == M;
}
};
如果要求不要循环呢?
先看循环了多少次,对于32位整数,负数全部为false,正数部分,2的幂也就31个。4的幂也就15个,所以3的幂应该在16~30个(实际是20个)。
所以循环次数是很少的。
不循环就要分析数字特征了:
对于2,从二进制看,最小的是1,然后依次是2, 4, 8……也就是这个bit1不断移位,因此其二进制bit应该只有一个1,其他全零。
因此可以进行bit计数。只有1个就true,0个或者多个就是false。
其实这种方法仍然有循环,且次数固定为31次。相当于算法一的最坏情况。。。
还有一种考虑方法,由于只有一个bit是1,那么其减一后,bit为1的位一定和原来的bit不在相同的位置。
所以有算法二:
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && !(n & (n - 1));
}
};
但是,对于3和4,不循环就没那么简单了。
从工程上说,由于数比较少,可以先计算一遍,保存起来,以后直接查表。
Example:
Given num = 16, return true. Given num = 5, return false.
Follow up: Could you solve it without loops/recursion? https://leetcode.com/problems/power-of-two/ https://leetcode.com/problems/power-of-three/
https://leetcode.com/problems/power-of-four/
常规解法:
直接进行除法运算,如果能整除,则返回真,否则返回假。
把M分别换成2,3,4,即可AC。
算法一:
class Solution {
public:
bool isPowerOfTwo(int n) {
const int M = 2;
if (n < 1)
return false;
if (n == 1)
return true;
while (n % M == 0 && n > M)
n /= M;
return n == M;
}
};
如果要求不要循环呢?
先看循环了多少次,对于32位整数,负数全部为false,正数部分,2的幂也就31个。4的幂也就15个,所以3的幂应该在16~30个(实际是20个)。
所以循环次数是很少的。
不循环就要分析数字特征了:
对于2,从二进制看,最小的是1,然后依次是2, 4, 8……也就是这个bit1不断移位,因此其二进制bit应该只有一个1,其他全零。
因此可以进行bit计数。只有1个就true,0个或者多个就是false。
其实这种方法仍然有循环,且次数固定为31次。相当于算法一的最坏情况。。。
还有一种考虑方法,由于只有一个bit是1,那么其减一后,bit为1的位一定和原来的bit不在相同的位置。
所以有算法二:
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && !(n & (n - 1));
}
};
但是,对于3和4,不循环就没那么简单了。
从工程上说,由于数比较少,可以先计算一遍,保存起来,以后直接查表。
相关文章推荐
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- leetcode----Longest Substring Without Repeating Characters
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- 021-Merge Two Sorted Lists(合并两个排好序的单链表);leetcode
- LeetCode[Day 1] Two Sum 题解
- LeetCode[Day 2] Median of Two Sorted Arrays 题解
- LeetCode[Day 3] Longest Substring Without... 题解
- LeetCode [Day 4] Add Two Numbers 题解