Leetcode326--3的幂

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,所以这里进行精度的限制。
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
在这里插入图片描述

注: 文中有写错的地方,欢迎大家不吝指正!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值