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


    这是悦乐书的第199次更新,第208篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第64题(顺位题号是263)。编写一个程序来检查给定的数字是否是一个丑陋的数字。丑陋的数字是正数,其主要因子仅包括2,3,5。例如:

    输入:6
    输出:true
    说明:6 = 2×3

    输入:8
    输出:true
    说明:8 = 2×2×2

    输入:14
    输出:false
    说明:14并不丑陋,因为它包含另一个因子7。

    注意

    • 1通常被视为丑陋的数字。

    • 输入在32位有符号整数范围内:[ -2^31, 2^31 - 1]。

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

    02 第一种解法

    特殊情况:1是丑陋数字,小于等于0的不是丑陋数字。

    正常情况:num如果是丑陋数字,可以分为两种情况:一是单纯的某一因子的幂次方,二是三个因子的随机排列组合,可能两个一起出现,也有可能三个一起出现。除以这三个因子中的一个,最后商是1,则说明这个数是丑陋数字;除以这三个因子中的两个或三个,最后商是1,那么这个数也是丑陋数字。

    对此,使用两层循环,外层循环控制因子,从2开始,一直到5,中间有个4其实就是2的平方,也可以算作其中的一个因子,内层循环先判断对当前因子取余是否等于0,如果不等于0则说明可能是另外的因子的积,也有可能不是丑陋数字,如果等于0,则除以当前因子获取商,重新赋值给num,继续判断和循环。

    public boolean isUgly(int num) {
        if (num > 0) {
            for (int i = 2; i < 6; i++) {
                while (num % i == 0) {
                    num /= i;
                }
            }
        }
        return num == 1;
    }
    

    03 第二种解法

    将2,3,5这三个因子放入数组,使用两层循环,外层依次取出数组中的因子,内层做取余判断和求商,前提条件是num大于0。

    public boolean isUgly2(int num) {
        if (num > 0) {
            int[] arr = {2, 3, 5};
            for (int d : arr) {
                while (num % d == 0) {
                    num /= d;
                }
            }
        }
        return num == 1;
    }
    

    04 第三种解法

    也可以分开来计算商,使用3个循环分开判断取余和求商,最后判断num等不等于1。

    public boolean isUgly3(int num) {
        if (num > 0) {
            while (num % 2 == 0) {
                num /= 2;
            }
            while (num % 3 == 0) {
                num /= 3;
            }
            while (num % 5 == 0) {
                num /= 5;
            }
        }
        return num == 1;
    }
    

    05 第四种解法

    使用递归的解法,判断逻辑和上面两种解法一样,对2取余等于0的话,除以2后继续调用自身,对于3和5,情况一样,最后判断是否等于1。

    public boolean isUgly4(int num) {
        if (num <= 0) {
            return false;
        }
        if (num % 2 == 0) {
            return isUgly4(num/=2);
        }
        if (num % 3 == 0) {
            return isUgly4(num/=3);
        }
        if (num % 5 == 0) {
            return isUgly4(num/=5);
        }
        return num == 1;
    }
    

    06 小结

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

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

  • 相关阅读:
    Raid磁盘阵列更换磁盘时另一块盘离线恢复案例(v7000存储数据恢复)
    服务器SQL server数据库被加密恢复方案
    Vsan分布式文件系统逻辑架构损坏恢复过程
    Linux服务器数据恢复案例,服务器瘫痪数据恢复成功
    数据库执行truncate table CM_CHECK_ITEM_HIS
    服务器ocfs2文件系统被误格式化的数据恢复过程
    内蒙古某公司XFS文件系统服务器数据恢复报告
    关于vsan分布式服务器数据恢复成功案例分享
    北京某公司存储数据恢复成功案例;存储崩溃数据恢复方法
    IBM X3850服务器数据恢复成功案例
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10111140.html
Copyright © 2020-2023  润新知