这是悦乐书的第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,最后比较两数是否相等。当然,你也可以做除法。

  1. public boolean isPowerOfThree(int n) {
  2. long m = 1;
  3. while (m < n) {
  4. m *= 3;
  5. }
  6. return m == n;
  7. }

03 第二种解法

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

  1. public boolean isPowerOfThree2(int n) {
  2. if (n == 0) {
  3. return false;
  4. }
  5. if (n == 1) {
  6. return true;
  7. }
  8. if (n > 1) {
  9. return n%3 == 0 && isPowerOfThree2(n/3);
  10. }
  11. return false;
  12. }

04 第三种解法

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

  1. public boolean isPowerOfThree3(int n) {
  2. if (n == 0) {
  3. return false;
  4. }
  5. if (n == 1) {
  6. return true;
  7. }
  8. while (n%3 == 0) {
  9. n /= 3;
  10. }
  11. return n == 1;
  12. }

05 第四种解法

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

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

06 第五种解法

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

3^X == N

log (3^X) == log N

X log 3 == log N

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

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

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

07 第六种解法

借助包装类Integer的toString方法。

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

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

08 第七种解法

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

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

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. 实战!基于lamp安装wordpress详解-技术流ken

    简介 LAMP 是Linux Apache MySQL PHP的简写,其实就是把Apache, MySQL以及PHP安装在Linux系统上,组成一个环境来运行动态的脚本文件.现在基于lamp搭建wor ...

  2. hadoop框架详解

    Hadoop框架详解 Hadoop项目主要包括以下四个模块 ◆ Hadoop Common: 为其他Hadoop模块提供基础设施 ◆ Hadoop HDFS: 一个高可靠.高吞吐量的分布式文件系统 ◆ ...

  3. ListView的setOnItemClickListener位置错乱问题

    如果你对一个ListView同时addHeaderView(listhHeaderView),也就是头部视图,再加setAdapter,当你加上setOnItemClickListener事件后你会发 ...

  4. C++中的queue类、QT中的QQueue类

    C++中的queue 实现一种先进先出的数据结构,是一个模板类 头文件 #include<queue> 用法(以int型为例): queue<int> Q; //定义一个int ...

  5. Docker 系列六(Docker Swarm 项目).

    一.前言 随着互联网快速发展,以及微服务架构的流行,服务器的压力越来越大.上一篇介绍的 Docker Compose 项目,可以将多个容器捏合在一起,实现容器间的通信,比如 Web 项目对 DB.Ca ...

  6. 持续集成 自动化构建、测试、部署您的Coding代码

    持续集成(Continuous Integration)指的是,频繁地(一天多次)将代码集成到主干. 持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量. 它的核心措施是,代码集成到主干之前, ...

  7. C# AESCBC256 与 java AESCBC256 加解密

    和某上市公司对接接口,他们试用 java AES CBC PKCS5 256 加解密.网上C# 基本不合适. 注意:C# PKCS7 对应 java PKCS5 /// <summary> ...

  8. JS取出两个数组中的不同或相同元素

    1.取出两个数组的不同元素 var arr1 = [0,1,2,3,4,5]; var arr2 = [0,4,6,1,3,9]; function getArrDifference(arr1, ar ...

  9. es6 语法 (类与对象)

    { // 基本定义和生成实例 class Parent{ constructor(name='mukewang'){ this.name=name; } } let v_parent1=new Par ...

  10. element vue validate验证名称重复 输入框与后台重复验证 特殊字符 字符长度 及注意事项

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...