69 - 2的幂
Last updated
Was this helpful?
Last updated
Was this helpful?
给定一个整数,编写一个函数来判断它是否是 2 的幂次方。
示例 1:
输入: 1 输出: true 解释: $2^0$ = 1
示例 2:
输入: 16 输出: true 解释: $2^4$= 16
示例 3:
输入: 218 输出: false
看到题目,第一反应就是在考数学😂😂,肯定有什么骚操作的题解
$n = 2^x$也就是说$x = log_2(n)$,只要这个x是整数,那么这个n就是2的幂
Runtime: 80 ms, faster than 29.44% of JavaScript online submissions for Power of Two.
Memory Usage: 35.5 MB, less than 69.23% of JavaScript online submissions for Power of Two.
%1
的意思是判断有没有小数点。如果是整数,那么就是0
Runtime: 0 ms, faster than 100.00% of Go online submissions for Power of Two.
Memory Usage: 2.3 MB, less than 25.00% of Go online submissions forPower of Two.
go里面的取余,需要两边都是int,然而既然都是整数了,那么%1
也就失去作用了。
那么怎么判断log出来的float64有没有小数点呢?我的做法是让它变成字符串,然后找一下里面有没有.
f,表明没有指数。这是默认的缺省值。
-1,精度-1就全部变成字符串。如果规定精度,那么就一定有小数点了。
64是制定浮点类型,是float64
Runtime: 68 ms, faster than 83.02% of JavaScript online submissions for Power of Two.
Memory Usage: 35.6 MB, less than 46.15% of JavaScript online submissions for Power of Two.
之前发现了一个骚操作,可以用>>>
来代替Math.floor(n/2)
。但似乎在大数的时候就不行。
反例是-2147483648
,理应是false,但用>>>
是true
Runtime: 4 ms, faster than 40.71% of Go online submissions for Power of Two.
Memory Usage: 2.2 MB, less than 100.00% of Go online submissions for Power of Two.
Runtime: 68 ms, faster than 82.73% of JavaScript online submissions for Power of Two.
Memory Usage: 35.4 MB, less than 100.00% of JavaScript online submissions for Power of Two.
Runtime: 0 ms, faster than 100.00% of Go online submissions for Power of Two.
Memory Usage: 2.2 MB, less than 100.00% of Go online submissions for Power of Two.
作者:jyd
简言之,满足n > 0
且 n & (n - 1) == 0
的,就是2的幂。
Runtime: 68 ms, faster than 83.12% of JavaScript online submissions for Power of Two.
Memory Usage: 35.9 MB, less than 15.38% of JavaScript online submissions for Power of Two.
Runtime: 0 ms, faster than 100.00% of Go online submissions for Power of Two.
Memory Usage: 2.2 MB, less than 75.00% of Go online submissions forPower of Two.
还是从这个大佬看到的
Runtime: 76 ms, faster than 45.28% of JavaScript online submissions for Power of Two.
Memory Usage: 35.7 MB, less than 23.08% of JavaScript online submissions for Power of Two.
整数范围是 -2147483648 (-2^31) ~ 2147483647 (2^31-1),因此2的最大幂为 2^30 = 1073741824.
如果n是2的幂,$n=2^k$,其中k是整数
$2^{30} = (2^k)*2^{30-k}$,即$2^{30}$ % $2^k$ === 0
如果n不是2的幂,假设$n=j*2^k$,其中k是整数,j是奇数
$2^{30}$ % $j*2^k$ == $2^{30-k}$ % j !=0
【其实我不太懂,为啥j是一个奇数,或者说不应该是$2^k$加上某个数吗?】
Runtime: 0 ms, faster than 100.00% of Go online submissions for Power of Two.
Memory Usage: 2.2 MB, less than 75.00% of Go online submissions forPower of Two.
如果是2的幂,那么1的个数就只有一个
js没有现成的数二进制个数的方法,只能手写一个
Runtime: 72 ms, faster than 65.74% of JavaScript online submissions for Power of Two.
Memory Usage: 36.2 MB, less than 15.38% of JavaScript online submissions for Power of Two.
js里面数1个数的方法有许多,比如说还有:
Runtime: 76 ms, faster than 45.28% of JavaScript online submissions for Power of Two.
Memory Usage: 35.7 MB, less than 23.08% of JavaScript online submissions for Power of Two.
这个也用了n&(n-1)
的骚操作
还有:
Runtime: 76 ms, faster than 45.28% of JavaScript online submissions for Power of Two.
Memory Usage: 35.6 MB, less than 23.08% of JavaScript online submissions for Power of Two.
go里面也没现成的方法,只能手写。手写的方法和js差不多
Runtime: 0 ms, faster than 100.00% of Go online submissions for Power of Two.
Memory Usage: 2.2 MB, less than 75.00% of Go online submissions forPower of Two.
剩下的懒得写了。
32位整数下,2的幂一共就只有31个,所以。。
Runtime: 64 ms, faster than 92.65% of JavaScript online submissions for Power of Two.
Memory Usage: 35.7 MB, less than 23.08% of JavaScript online submissions for Power of Two.
速度拉满😂😂
go用这个不好查,得用map写。我就懒得写了。。反正怎么写都0ms封顶了
很麻烦的感觉。。一大堆参数
看来在js里,还是
链接: