在Leetcode上发现了三个很有趣的Power of N
的题,分别是判断一个数是否是2、3、4的n次幂。
在第一次刷题的时候,全部采用的都是将数字num转换为n进制,然后判断该进制是否为1个1加上x个0的形式,从而得到结果。
在第二次刷题的时候,特别注意了Follow up: Could you do it without using any loop / recursion?
,从而开始思考怎么样不使用循环或递归来完成这三个题。以下是题目和解法,以及通过这三个题我所做出的一些总结。
文章目录
题目和解法
231. Power of Two[Easy]
Description
Given an integer, write a function to determine if it is a power of two.
Example
Input: 2
Output: true
Solution
该题可以通过位运算来解决,不难发现,2的n次幂具备一个独一无二的特点:将这个数字转换为2进制,它一定是1个1加上x个0的形式,这是非2的n次幂所不具备的特点。因此将该数减去1和该数本身做异或运算所得结果如果为0,则该数一定是2的n次幂,反之不是,由此得到一个不需要使用循环或递归的解法。
class Solution {
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
}
232. Power of Three[Easy]
Description
Given an integer, write a function to determine if it is a power of three.
Example
Input: 3
Output: true
Solution
可以很容易知道,319 < 231 - 1 < 320,那么一个类型为int的数,如果它是3的n次幂,它一定能够整除319,也就是说319对3的n次幂取余一定为0,由此得到一个不需要使用循环或递归的解法。
class Solution {
public boolean isPowerOfThree(int n) {
// 1162261467 is 3^19, 3^20 is bigger than int
return n > 0 && 1162261467 % n == 0;
}
}
342. Power of Four[Easy]
Description
Given an integer, write a function to check whether it is a power of 4.
Example
Input: 4
Output: true
Solution
首先,Power of Three的解决办法不适用于Power of Four,这是因为能整除415的数还有可能是Power of Two,因此需要想办法过滤掉Power of Two当中不属于Power of Four的数字。容易想到,可以使用位运算来进行判断,如果一个数是4的n次幂,那么它和0x55555555
进行与运算的结果肯定不为0,这是因为(5)10 = (0101)2,而4的n次幂转换为2进制一定会是1个1加上2x个0的形式,而0x55555555
的奇数位全为1,因此就能通过与0x55555555
做与运算,从而判断该2的n次幂是不是4的n次幂。
class Solution {
public boolean isPowerOfFour(int num) {
return num > 0 && (num & (num - 1)) == 0 && (num & 0x55555555) != 0;
}
}
总结
对于Power of N的问题来说,其实有以下几个固定的解决思路:
1、如果N=2,那么可以直接使用(num & (num - 1)) == 0
条件,判断输入是否是Power of Two;
2、如果N为质数(素数),那么可以通过寻找小于231 - 1的最大的N的n次幂的这个数num
。如当N=3时,这个数是319,再通过判断输入数字是否能整除数num
,从而判断输入是否是Power of Three;
3、如果N不是质数(素数),那么可以通过将N拆分成质数乘积的形式,先判断输入是否是所拆分成的质数的n次幂,如果是的话,再通过N的质数乘积的一些特点做一些特定的判断方法。如当N=4时,通过将输入和0x55555555
进行与运算从而判断该2的n次幂是否是4的n次幂。