【LeetCode231算法/编程练习C++】--判断是否是2的整数次幂 //按位与&的用处

来源:互联网 发布:支持php的web服务器 编辑:程序博客网 时间:2024/05/01 17:27

231. Power of Two


Given an integer, write a function to determine if it is a power of two.

LeetCode第231题:判断一个数字n是不是2的整数幂:


第一种解法

//简单无脑while(n)除以2,时间复杂度O(logn)

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

更为简洁的写法:

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

第二种解法:迭代
bool isPowerOfTwo(int n) {return n>0 && (n == 1 || (n % 2 == 0 && isPowerOfTwo(n / 2)));}

第三种解法:按位与 ,n&(n-1),非常机智,巧妙利用只有2的整数幂和n-1按位与之后为0(0除外)
举个栗子:
  • n = 2 ^ 0 = 1 = 0b0000...00000001, and (n - 1) = 0 = 0b0000...0000.
  • n = 2 ^ 1 = 2 = 0b0000...00000010, and (n - 1) = 1 = 0b0000...0001.
  • n = 2 ^ 2 = 4 = 0b0000...00000100, and (n - 1) = 3 = 0b0000...0011.
  • n = 2 ^ 3 = 8 = 0b0000...00001000, and (n - 1) = 7 = 0b0000...0111.
bool isPowerOfTwo(int n) {return n>0 && ((n & (n - 1)) == 0);}



第四种解法:
看到的时候眼前一两,非常装逼……时间复杂度是O(1)

毕竟int的大小是有限制的……-2^31(-2,147,483,648)2^31-1(2,147,483,647)

bool isPowerOfTwo(int n) {return n>0 && (1073741824 % n == 0);}



//顺手祝自己阴历生日快乐,晚上吃面~



0 0