zoukankan      html  css  js  c++  java
  • Valid Perfect Square

    1、题目

    Given a positive integer num, write a function which returns True if num is a perfect square else False.
    
    Note: Do not use any built-in library function such as sqrt.
    
    Example 1:
    
    Input: 16
    Returns: True
    Example 2:
    
    Input: 14
    Returns: False

    2、求解一:比较正常的解法,也是比较容易想到的

    public boolean isPerfectSquare(int num) {
            boolean flg = false;
            //注意这里要考虑特殊情况
            if(num == 1) return  true;
            //这里要从i=1开始,并且要有等号,这是在debug中测试发现的漏洞之处,导致一致不能accept
            for(int i = 1; i <= num/i; i++){
                if(num == i * i){
                    flg = true;
                }
            }
            return flg;
        }

    3、求解二:针对第一种思路,如何减小i遍历的次数

    思路:如果num=36 ,对num/2=16, 16 * 16 =256 > num;再对16 / 2 = 8 ; 8 * 8 = 64 > num ; 再对8 /2 =4,4 * 4 < num , 所以现在我们就将范围缩小到了 4 --8  ,所以有的时候我们只需要简单用一个实际的例子就可以找出大概思路了

      public boolean isPerfectSquare(int num) {
            if(num == 1) return true;
            long m =  num / 2;
            long r = m * m;
            while( r > num){
                m = m /2 ;
                r = m * m;
            }
            //这里使得i的遍历次数最小
            for(long i = m; i < 2 * m; i++){
                if(m * m == num){
                    return true;
                }
            }
            return false;
        }

    4、求解四:二分法来寻找

     public boolean isPerfectSquare(int num) {
           int left = 1;
           int right = num;
           //利用while循环以 left<=right为终止条件
          while (left <= right){
              int middle = left + (right - left)/2;
              int s = middle * middle;
              if(s == num) return true;
              if(s > num){
                  right = middle -1;
              }else left = middle + 1;
          }
          return false;
        }

    5、求解五:利用完全平方是一系列奇数之和

      public boolean isPerfectSquare(int num) {
            //这里如何判断num是由一系列奇数的相加之和
            //利用while循环 看最后剩下的是不是0
            int i = 1;
            while (num > 0){
                num = num - i;
                i = i + 2;
            }
            return num == 0;
    
        }


    欢迎关注我的公众号:小秋的博客 CSDN博客:https://blog.csdn.net/xiaoqiu_cr github:https://github.com/crr121 联系邮箱:rongchen633@gmail.com 有什么问题可以给我留言噢~
  • 相关阅读:
    Android安卓 _“Activity"_01+简单的拨号器
    Android安卓 “内部类”
    我的第一天 Andorid “hello_world”
    Android sqlite 创建数据库
    Sqlite(代码 jabc)
    判断网络状态
    Android sqlite(jdbc)
    Android 单机事件的使用
    JAVA内部类(成员.局部.匿名)
    我的第一个Android程序
  • 原文地址:https://www.cnblogs.com/flyingcr/p/10326889.html
Copyright © 2011-2022 走看看