leetCode-342. 4的幂

270 阅读1分钟

题目链接

题目描述

给定一个整数,写一个函数来判断它是否是 4 的幂次方。如果是,返回 true ;否则,返回 false 。

整数 n 是 4 的幂次方需满足:存在整数 x 使得n == 4^x

示例 1: 输入:n = 16 输出:true

示例 2: 输入:n = 5 输出:false

示例 3: 输入:n = 1 输出:true   提示: -2^{31} <= n <= 2^{31} - 1   进阶: 你能不使用循环或者递归来完成本题吗?

题解

思路一

利用递归不停的除4,看最后商是否为1,代码如下

 func isPowerOfFour(_ n: Int) -> Bool {
    if n < 1 {
        return false
    }
    if n == 1 {
        return true
    }
    if n % 4 == 0 {
        return isPowerOfFour(n / 4)
    } else {
        return false
    }
}

思路二

4^x = 2^{2^x} = 2^{2x} 可证明一个数是若是4的x冥,那它一定是2的冥。

首先看2的冥二进制数的规律,2^0 = 1,即首位为1,其他位为0,而每右移一位,相等于乘于2,因此2^x即第x位为1,其他位皆为0,而2^x - 1则是第x位为0,其他位皆为1.

由此可得出。如果一个数n大于零,并且n & (n - 1) == 0,则n是2的冥。

接下来看4的冥二进制数的规律4^0 = 1,即首位为1,其他位为0,而每右移两位,相等于乘于4,因此4^x即第2x(偶数)位为1,其他位皆为0,我们可以构造一个奇数为都为1的mask0xaaaaaaaa与它相&。

由此可得出。如果一个数n大于零,并且n && (n - 1) == 0 && n & 0xaaaaaaaa == 0,则n是4的冥,代码如下

func isPowerOfFour(_ n: Int) -> Bool {
    return n > 0 &&  n & (n - 1) == 0  && n & 0xaaaaaaaa == 0
}

思路三

有上面可知一个数是若是4的x冥,那它一定是2的冥。而把2的冥换成4的冥的话,可得如下2种情况。

2n={4n2n%2==04n122n%2==12^n=\left\{ \begin{array}{lr} 4^{\frac{n}{2}}& & & n \% 2 == 0 \\ 4^{\frac{n - 1}{2}} * 2& & & n \% 2 == 1 \\ \end{array} \right.

有上面的公式可得出,如果一个数,若是2的冥,他要么是4的冥,要么是4的冥的2倍。先暂时记住这个结论。

再继续之前,先介绍一下二项式定理。

(a+b)n=(n0)anb0+(n1)an1b1+(n2)an2b2+...+(nn1)a1bn1+(nn)a0bn(a+b)^n = \binom {n}{0}a^n*b^0 + \binom n1 a^{n-1}*b^1 + \binom n2 a^{n-2}*b^2 + ... + \binom n{n-1} a^1*b^{n-1} + \binom nn a^0*b^n

其中每个(nk){\displaystyle {\tbinom {n}{k}}} 为一个称作二项式系数的特定正整数,其等于n!k!(nk)!{\displaystyle {\frac {n!}{k!(n-k)!}}}。这个公式也称二项式公式或二项恒等式。因此4的冥展开如下:

4n=(3+1)n=(n0)3n10+(n1)3n111+(n2)3n212+...+(nn1)311n1+(nn)301n4^n \\ = (3+1)^n = \binom {n}{0}3^n*1^0 + \binom n1 3^{n-1}*1^1 + \binom n2 3^{n-2}*1^2 + ... + \binom n{n-1} 3^1*1^{n-1} + \binom nn 3^0*1^n

4的冥对3求进行相除

4n/3=(3+1)n/3=((n0)3n10+(n1)3n111+(n2)3n212+...+(nn1)311n1+(nn)301n)/3=((n0)3n+(n1)3n1+(n2)3n2+...+(nn1)31+(nn)30)/3=((n0)3n1+(n1)3n2+(n2)3n3+...+(nn1)30)14^n / 3 \\ = (3+1)^n / 3 \\ = (\binom {n}{0}3^n*1^0 + \binom n1 3^{n-1}*1^1 + \binom n2 3^{n-2}*1^2 + ... + \binom {n}{n-1}3^1 * 1^{n-1} + \binom nn 3^0 * 1^n ) / 3 \\ = (\binom {n}{0}3^n + \binom n1 3^{n-1} + \binom n2 3^{n-2} + ... + \binom {n}{n-1}3^1 + \binom nn 3^0 ) / 3 \\ = (\binom {n}{0}3^{n - 1} + \binom n1 3^{n-2} + \binom n2 3^{n-3} + ... + \binom {n}{n-1}3^0) \cdots\cdots 1

有上可得出4的冥对3求余一定为1,同理也可得出4^n * 2对3求余一定为2.

由上面两个结论可以得出: 若一个数是2的冥,并且对3求余为1,那么则这个数为4的冥,代码如下

func isPowerOfFour(_ n: Int) -> Bool {
    return n > 0 &&  n & (n - 1) == 0  && n % 3 == 1
}