leetcode: power of three 三种解法

原创 2017年08月01日 22:16:39

一、题目

leetcode 上有这么一道题,power of three.

题目如下:

Given an integer, write a function to determine if it is a power of three.

要求:

Could you do it without using any loop / recursion?

就是说给出一个数,判断该数是否是 3 的 n 次方。且最好不要使用循环或者迭代来实现。

二、解法:

1、方法一、

使用最基本的循环判断,通过循环判断目标值是否可以对 3 进行整除。代码如下:

while(n)
  {
      if(n==1)return true;
      if(n%3 != 0)
          return false;
      n /= 3;
      if(n == 1)
          return true;
  }
  return false;

2、方法二、

由于在 int(4字节)的范围内,3 最大的一个次方数为 3^19,即 1162261467,可用该数值对目标值进行取余操作,如果余数为 0,则说明目标值是一个 3 的某次方数。代码如下:

if(n <= 0)return false;
if(1162261467%n == 0)
    return true;
else
    return false;

3、方法三

通过对目标值取 3 的对数,判断该值是否为整数来判断。利用换底公式,log3(n) = log10(n) / log10(3)。利用a-(int)a == 0 来判断 a 是否为整数。代码如下:

double res;
res = log10(n)/log10(3);
if(res- (int)res == 0)
    return true;
else
    return false;

三种解法的代码在 leetcode 网站的运行时间如下图:
- 1、方法一
这里写图片描述
- 2、方法二
这里写图片描述
- 3、方法三
这里写图片描述

可见,第二种最好,第一种次之,第三种最差。
类似的题目还有 power of two, power of four,使用上述三种方法略加修改即可。但是在题目 power of four 时,由于 4 本身是 2 的平方,所以第二种方法会失效。这是因为2^奇数次方 != 4 的 n 次方。所以需要加入限制条件,代码如下:

if(n <= 0)return false;
   if(4294967296%n == 0)
   {
       if((int)(log10(n)/log10(2)) % 2 == 0)
           return true;
       else
           return false;
   }
   else
       return false;

三、附录

全部代码:

/*
*326. Power of Three
* three ways to solution this problem
*/

#include <stdio.h>
#include <stdbool.h>
#include <math.h>

#define solution 3

bool isPowerOfThree(int n) {

  #if solution==1
  //循环迭代
    while(n)
    {
        if(n==1)return true;
        if(n%3 != 0)
            return false;
        n /= 3;
        if(n == 1)
            return true;
    }
    return false;
  #elif solution==2
  //32位数中最大的3次方数
    if(n <= 0)return false;
    if(1162261467%n == 0)
        return true;
    else
        return false;
  #elif solution==3
  //对数换底公式
  //使用 a-(int)a == 0; 来判断a是否为整数
    double res;
    res = log10(n)/log10(3);
    if(res- (int)res == 0)
        return true;
    else
        return false;
  #endif
}

int main()
{
    int num = 4782968;
    bool res = false;

    res = isPowerOfThree(num);
    printf("res = %d\n",res);

    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问个人主页 http://cyang.tech

<LeetCode OJ> 326. Power of Three

326. Power of Three My Submissions Question Total Accepted: 1159 Total Submissions: 3275 Difficu...
  • EbowTang
  • EbowTang
  • 2016年01月08日 22:44
  • 9010

Leetcode 326. Power of Three

Given an integer, write a function to determine if it is a power of three. Follow up: Could you do i...
  • Joyem123
  • Joyem123
  • 2016年05月19日 00:06
  • 122

326. Power of Three

题目Given an integer, write a function to determine if it is a power of three.Follow up: Could you do...
  • toyijiu
  • toyijiu
  • 2017年02月27日 22:54
  • 116

【Leetcode】:326. Power of Three 问题 in JAVA

Given an integer, write a function to determine if it is a power of three. Follow up: Could yo...
  • u013564276
  • u013564276
  • 2016年05月07日 15:46
  • 646

leetcode(11),Power of Three(python)

question: Given an integer, write a function to determine if it is a power of three. Follow ...
  • chinwuforwork
  • chinwuforwork
  • 2016年05月26日 23:12
  • 203

LeetCode-Power of Three

Problem:Given an integer, write a function to determine if it is a power of three.Follow up: Could y...
  • u010305706
  • u010305706
  • 2016年01月18日 23:27
  • 200

leetcode---Power of Three

Given an integer, write a function to determine if it is a power of three.判断是不是3的幂次,首先看3是不是它的因子,如果是再...
  • a1b2c3d4123456
  • a1b2c3d4123456
  • 2016年03月17日 20:55
  • 367

Leetcode:326. Power of Three(JAVA)

【题目描述】 Given an integer, write a function to determine if it is a power of three. Follow up:...
  • u010183658
  • u010183658
  • 2016年03月03日 16:51
  • 918

leetcode_326 Power of Three

题目分析:给定一个32位有符号整型数,判断其是否是3的幂次。 解题思路:方法1首先,判断整型数是否小于等于0,如果小于等于0,则一定不是3的幂次;然后,对整型数与3取余,如果余数为0,则将整型数除以3...
  • yzhang6_10
  • yzhang6_10
  • 2016年05月09日 23:15
  • 530

[python语法巩固][leetcode326][Power of Three]

题目大意:让你判断一个int是否为3的幂;最简单的思路C++class Solution { public: bool isPowerOfThree(int n) { for(...
  • zy691357966
  • zy691357966
  • 2016年01月09日 21:05
  • 1298
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:leetcode: power of three 三种解法
举报原因:
原因补充:

(最多只允许输入30个字)