LeetCode每日一题231: 2的幂

作者: FesonX | 来源:发表于2019-01-11 10:28 被阅读0次

题目

给定一个整数,编写一个函数来判断它是否是 2 的幂次方。

示例 1:
输入: 1
输出: true
解释: 20 = 1

示例 2:
输入: 16
输出: true
解释: 24 = 16

示例 3:
输入: 218
输出: false


解法

解法1

不做过多的判断, 对给定的 n除法运算或做右移运算
改进方法是对 n%2 判断是否为0,加上这个判断就可以大幅提升速度

如果不加的话,就等同于暴力解法了,直接超出时间限制

C实现

bool isPowerOfTwo(int n) {
    if (n<=0)
        return false;
    while(n%2 == 0)
        n /= 2;
    return n==1;
}
image.png

解法2

递归解法与上面类似,返回语句上有差别,同样,在这里最重要的语句是
if (n%2 ==1), 在Python实现中, 这条语句让时间消耗从 436ms 提升至 64ms 比较神奇的是, 递归和前面的非递归获得了相同的结果.

C实现

bool isPowerOfTwo(int n) {
    if (n == 0)
        return false;
    if (n == 1)
        return true;
    if (n%2 ==1)
        return false;
    n = n/2;
    return isPowerOfTwo(n);
}

Python实现

class Solution:
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n==0:
            return False
        if n==1:
            return True
        if n%2 == 1:
            return False
        n = n/2
        return self.isPowerOfTwo(n)
结果

解法3

解法3 来自评论区的大佬指点, 利用位运算去判断.

所有的 2^n 二进制写法均为 10......000 的形式, 而 2^n-1 都是 01....111的形式, 二者按位与, 结果必为 0

需要C语言中 & 与 二目运算符 == 的运算优先级, 如果用 n & (n-1) == 1 的话, 结果是错的. BTW, 这种写法的速度也不如直接取反

C实现

bool isPowerOfTwo(int n) {
    if (n<=0)
        return false;
    return !(n&(n-1));
}

Python实现

class Solution:
    def isPowerOfTwo(self, n):
        """
        :type n: int
        :rtype: bool
        """
        if n <= 0:
            return False
        return n&(n-1) == 0

相关文章

  • LeetCode每日一题231: 2的幂

    题目 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 1:输入: 1输出: true解释: 20 ...

  • 一起学算法-231. 2 的幂

    一、题目 LeetCode-231. 2 的幂链接:https://leetcode-cn.com/problem...

  • LeetCode 231-240

    231. 2的幂[https://leetcode-cn.com/problems/power-of-two/] ...

  • Leecode 位运算

    231. 2的幂[https://leetcode-cn.com/problems/power-of-two/] ...

  • Leetcode 231 2的幂

    题目 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 1: 输入: 1输出: true解释: 20...

  • (n&n-1)==0是不是2的幂次

    leetcode231. 2的幂 “给定一个整数,编写一个函数来判断它是否是 2 的幂次方。” 有大神用一行代码搞...

  • [LeetCode]231-2的幂

    231. 2的幂给定一个整数,编写一个函数来判断它是否是 2 的幂次方。示例:输入: 1 -> 输出: true输...

  • Leetcode 231. 2的幂

    题目描述 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 1: 输入: 1输出: true解释: ...

  • leetcode 231 python 2的幂

    传送门 题目要求 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 1:输入: 1输出: true解...

  • LeetCode-231 2的幂

    题目 给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 示例 1: 示例 2: 示例 3: 我的AC 版本...

网友评论

    本文标题:LeetCode每日一题231: 2的幂

    本文链接:https://www.haomeiwen.com/subject/kymtdqtx.html