【Leetcode】Power of N

在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次幂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值