这是悦乐书的第204次更新,第215篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第71题(顺位题号是326)。给定一个整数,写一个函数来确定它是否为3的幂。例如:

输入:27

输出:true

输入:0

输出:false

输入:9

输出:true

输入:45

输出:false

跟进:你可以不使用任何循环/递归吗?

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

新建一个变量,只要其小于n,依次乘上3,最后比较两数是否相等。当然,你也可以做除法。

public boolean isPowerOfThree(int n) {
long m = 1;
while (m < n) {
m *= 3;
}
return m == n;
}

03 第二种解法

使用递归的方法。当n等于0的时候,返回false,当n等于1的时候,返回true。当n大于1的时候,先判断其对3取余是否等于 0,如果等于0,则将n除以3再调用自己。最后返回false。

public boolean isPowerOfThree2(int n) {
if (n == 0) {
return false;
}
if (n == 1) {
return true;
}
if (n > 1) {
return n%3 == 0 && isPowerOfThree2(n/3);
}
return false;
}

04 第三种解法

将第二种解法的递归换成迭代的方式也可以。

public boolean isPowerOfThree3(int n) {
if (n == 0) {
return false;
}
if (n == 1) {
return true;
}
while (n%3 == 0) {
n /= 3;
}
return n == 1;
}

05 第四种解法

利用取余。一般的思路是对3取余,但是这只能判断n是否是3的倍数,而不能保证是3的幂次方。但是我们可以反过来对n取余,借助1162261467这个整数,因为它是3的19次方,是int类型范围内3能够取到的最大幂次方数。只要n是3的幂次方,1162261467对n取余都会返回0。

public boolean isPowerOfThree4(int n) {
return n > 0 && 1162261467%n == 0;
}

06 第五种解法

利用数学中的对数算法。以下是推理步骤:

3^X == N

log (3^X) == log N

X log 3 == log N

X == (log N) / (log 3)

如果n是3的幂次方,那么将两数取对数后再做除法,得到的是一个以幂次方为整数位,以0位小数位的double类型数,那么对其取整再和自身做减法,那么它的绝对值肯定是无限接近于0的。

public boolean isPowerOfThree5(int n) {
double lg = Math.log(n)/Math.log(3);
return Math.abs(lg-Math.round(lg)) <= 0.00000000000001;
}

07 第六种解法

借助包装类Integer的toString方法。

Integer.toString(int par1, int par2),par1表示要转成字符串的数字,par2表示要转成的进制表示。我们可以将n转成3进制的数,那么只要是3的幂次方,转换成3进制字符串后,就是一个以1开头尾随k个0的字符串。

public boolean isPowerOfThree6(int n) {
if (n <= 1) {
return n == 1;
}
return Integer.toString(n, 3).matches("10*");
}

08 第七种解法

将int类型范围内所有3的幂次方整数放入一个HashSet中,然后判断n是否在HashSet中。

public boolean isPowerOfThree7(int n) {
HashSet<Integer> set = new HashSet<>(Arrays.asList(1, 3, 9, 27,
81, 243, 729, 2187, 6561, 19683, 59049, 177147, 531441,
1594323, 4782969, 14348907, 43046721, 129140163, 387420489, 1162261467));
return set.contains(n);
}

09 小结

算法专题目前已连续日更超过两个月,算法题文章71+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Power Of Three(Java实现-七种解法)的更多相关文章

  1. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  2. LeetCode算法题-Move Zeroes(Java实现-三种解法)

    这是悦乐书的第201次更新,第211篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第67题(顺位题号是283).给定一个数组nums,写一个函数将所有0移动到它的末尾,同 ...

  3. LeetCode算法题-Missing Number(Java实现-四种解法)

    这是悦乐书的第200次更新,第209篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第65题(顺位题号是268).给定一个包含n个不同数字的数组,取自0,1,2,...,n ...

  4. LeetCode算法题-Ugly Number(Java实现-四种解法)

    这是悦乐书的第199次更新,第208篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第64题(顺位题号是263).编写一个程序来检查给定的数字是否是一个丑陋的数字.丑陋的数 ...

  5. LeetCode算法题-Add Digits(Java实现-3种解法)

    这是悦乐书的第199次更新,第207篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第63题(顺位题号是258).给定非负整数num,重复添加其所有数字,直到结果只有一位数 ...

  6. LeetCode算法题-Power of Four(Java实现-六种解法)

    这是悦乐书的第205次更新,第216篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第72题(顺位题号是342).给定一个整数(带符号的32位),写一个函数来检查它是否为4 ...

  7. LeetCode算法题-Power Of Two(Java实现)

    这是悦乐书的第194次更新,第200篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第56题(顺位题号是231).给定一个整数,写一个函数来确定它是否是2的幂.例如: 输入 ...

  8. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  9. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

随机推荐

  1. Go基础系列:struct和嵌套struct

    struct struct定义结构,结构由字段(field)组成,每个field都有所属数据类型,在一个struct中,每个字段名都必须唯一. 说白了就是拿来存储数据的,只不过可自定义化的程度很高,用 ...

  2. CSS盒模型及边距问题

    盒模型是CSS的基石之一,页面的每一个元素都被看作一个矩形框,分别由外边距,边框,内边距,内容组成, 在CSS中,width和height的值指的是内容的宽高,增加外边距,边框,内边距并不会对内容造成 ...

  3. 将Python脚本打包成可执行文件

    Python是一个脚本语言,被解释器解释执行.它的发布方式: .py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库.(Python官方的各种安 ...

  4. 近20个绚丽实用的jQuery/CSS3侧边栏菜单(转载)

    http://developer.51cto.com/art/201510/493530.htm 近20个绚丽实用的jQuery/CSS3侧边栏菜单 jQuery作为一款主流的JavaScript前端 ...

  5. Asp.net 获取访问者IP

    using System.Web; namespace Wxlhjcyy.Public { public class GetIp { public static string IPAddress { ...

  6. spring aop 实践

    之前用的ssm框架,大部分只是利用spring的IOC特性,很明显这能够为我们开发人员在对象的创建上面节省大部分时间.当相似得到业务越来越多,很多代码也是越来越重复,轮子是越来越重复,比如验证用户登录 ...

  7. HTTP与HTTPs的区别?

    简而言之:   HTTPS = HTTP + SSL HTTP 的 URL 以 http:// 开头,而 HTTPS 的 URL 以 https:// 开头 HTTP 是不安全的,而 HTTPS 是安 ...

  8. intellij error updating changes svn解决办法

    乌龟检出的svn版本为1.8,而1.8在IntelliJ 上跑起来貌似有问题, 经过多次尝试,当Format改为1.7后,问题被解决.

  9. 数据库_Redis 入门基础到高级

    一.PHP消息队列实现及应用 二.消息队列的优缺点 三.消息队列的配置和准备工作 案例如下: 下面是队列表字段及属性 四.Mysql订单队列 1.接受订单,并写入数据 order.php <?p ...

  10. Go开发之路 -- strings以及strconv的使用

    strings的使用 HasPrefix 语法: strings.HasPrefix(s, prefix string) bool // 判断字符串s是否以prefix开头 // 判断一个url是否以 ...