zoukankan      html  css  js  c++  java
  • [leetcode] Poser of Three

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

    Example 1:

    Input: 27
    Output: true
    

    Example 2:

    Input: 0
    Output: false

    Example 3:

    Input: 9
    Output: true

    Example 4:

    Input: 45
    Output: false

    Follow up:
    Could you do it without using any loop / recursion?


    分析:题目翻译一下:要求判断一个正整数n是否是3的次幂。

    判断方法有很多,我们根据算法思想罗列一下。

    1、递归

    因为如果这个数字n是3的次幂,那么n/3一定也是3的次幂。因此只要不停/3递归就能判断出来了。

    代码如下:

     1 class Solution {
     2     public boolean isPowerOfThree(int n) {
     3         return helper(n);
     4     }
     5     private boolean helper(int n) {
     6         if ( n == 0 ) return false;
     7         else if ( n == 1 ) return true;
     8         if ( n % 3 == 0 ) return helper(n/3);
     9         return false;
    10     }
    11 }

        这里要注意第8行,在进行除以3操作之前,要判断这个数字是否对3取余为0。比如45,45/3=15,15/3=5,5/3=1,如果不判断,就会认为是true,其实在5的时候我们就发现他已经是false了。因此在递归过程中需要加上这个判断。

    2、循环

    循环思路很好理解,具体的思想和递归一样,只是不同的形式。

    代码如下:

     1 class Solution {
     2     public boolean isPowerOfThree(int n) {
     3         while ( n > 0 ){
     4             if ( n == 1 ) return true;
     5             if ( n % 3 == 0 ){
     6                 n = n / 3;
     7             }else {
     8                 return false;
     9             }
    10         }
    11         return false;
    12     }
    13 }

    3、数学方法

    因为要判断是否是3的次幂,那么对这个数取log以三为底的对数,得到的值一定是整数。

    关键点有两个:如何将n取log3为底的对数;如何判断是整数

    1 class Solution {
    2     public boolean isPowerOfThree(int n) {
    3         return Math.log10(n)/Math.log10(3) % 1 == 0;
    4     }
    5 }

    判断是否是整数,对1取余 是否 为0就可以了。

    其他的还有一些方法,有的太数学,有的太秀。。比如在int范围内,用3的最高次次幂(1162261467 % n) == 0,太数学,没有推广性。还有的将所有的可能取值保存在一个set中,只能说同九义,汝何秀。。。

  • 相关阅读:
    洛谷 P3413 【萌数】
    ANOI 2009 【同类分布】
    概率编程语言
    人类的视觉能力基本上是出生后逐渐习得的
    关“视觉神经系统是怎么形成的?”的思考
    MIPS指令集相关
    zookeeper源码之服务端
    zookeeper服务端
    c语言之结构
    c语言之函数
  • 原文地址:https://www.cnblogs.com/boris1221/p/9757101.html
Copyright © 2011-2022 走看看