Leetcode326–3的幂
不使用循环或者递归来完成本题
编程语言:python
作者:黑暗主宰
邮箱:shengzhanhe@gmail.com
Leetcode326–3的幂
题目描述
原题链接:
https://leetcode-cn.com/problems/power-of-three/ (中文)
https://leetcode.com/problems/power-of-three/ (英文)
题目描述:
给定一个整数,写一个函数来判断它是否是 3 的幂次方。
进阶:不使用循环或者递归来完成
示例 1: 输入: 27 输出: true |
---|
示例 2: 输入: 0 输出: false |
---|
示例3: 输入: 9 输出: true |
---|
示例 4: 输入: 45 输出: false |
---|
解题思路
方法1:循环
def isPowerOfThree(n):
times = 1
while times < n:
times *= 3
if times == n:
return True
else:
return False
#if n<=0:
# return False
#while n%3==0:
# n=n//3
#return n==1
也可以用循环移位的方法,把数字右移一位相当于乘以2,再加上本身就是3的倍数
def isPowerOfThree(n):
tmp = 1
while tmp < n:
tmp = (tmp << 1) + tmp
if tmp == n:
return True
else:
return False
方法二:递归
def isPowerOfThree(n):
if n == 1:
return True
if n == 0 or n%3 != 0:
return False
return self.isPowerOfThree(n/3)
进阶
方法1:
在32位整数中取一个最大的数,然后其除以3的幂,肯定能被整除
def isPowerOfThree(n):
return n > 0 and (1162261467 % n == 0)
#return n>0 and 3**19%n==0
方法2:
使用哈希值的方法,我们把32位整数所有的3的幂统计出来,然后判断是不是在这个列表中。
def isPowerOfThree(n):
return n in [1,3,9,27,81,243,729,2187,6561,19683,59049,177147,531441, 1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467]
方法3:
数学方法求解
def isPowerOfThree(n):
if n <= 0:
return False
res = round(math.log(n,3), 3)
if int(res) == res:
return True
else:
return False
上述代码解释,
n
=
3
m
,
m
=
log
3
n
\begin{array}{l} n = {3^m}, m = {\log _3}n \end{array}
n=3m,m=log3n, 然后还有一个换底公式(这里没有用到)
m
=
log
b
n
log
b
3
m = \frac{{{{\log }_b}n}}{{{{\log }_b}3}}
m=logb3logbn;代码中的round,是因为会出现精度的问题,就比如 math.log(243,3)
会得到结果4.9999999,所以这里进行精度的限制。
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
注: 文中有写错的地方,欢迎大家不吝指正!!!