题解《算法零基础100讲》(第7讲---丑数) (java版)

Posted 敲代码的xiaolang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解《算法零基础100讲》(第7讲---丑数) (java版)相关的知识,希望对你有一定的参考价值。

😁算法小白欢迎加入此社区https://bbs.csdn.net/forums/hero?category=0
由英雄大佬带领的抱团学算法队伍,从0开始,期待你的加入。🥳

本博文是对此文章习题所作的题解,如有不足,请多指教:
https://blog.csdn.net/WhereIsHeroFrom/article/details/120875207

今天的题很nice,因为两道都没搞出来,最后还是整整丑数吧。。。😅

在这里力推此为大佬的题解,分析的很是详细,笔者的代码也是参考此位大佬的思路和官方题解https://blog.csdn.net/qq_17593855/article/details/121012178

第一题:
https://leetcode-cn.com/problems/prime-palindrome/

结果:🤡竟是我自己

/* 官方题解 */
class Solution {
    public int primePalindrome(int N) {
        while (true) {
            if (N == reverse(N) && isPrime(N))
                return N;
            N++;
            if (10_000_000 < N && N < 100_000_000)
                N = 100_000_000;
        }
    }

    public boolean isPrime(int N) { /* 判断是否为素数 */
        if (N < 2) return false;
        int R = (int) Math.sqrt(N);
        for (int d = 2; d <= R; ++d)
            if (N % d == 0) return false;
        return true;
    }

    public int reverse(int N) { /* 反转,判断是否回文 */
        int ans = 0;
        while (N > 0) {
            ans = 10 * ans + (N % 10);
            N /= 10;
        }
        return ans;
    }
}/* 遍历所有数字,检查是不是回文串。
如果是,检查是不是素数。如果当前数字长度为 8,可以跳过检查,因为不存在 8 长度的素数。(我其实也不知道为啥不存在8长度的素数。。。)

*/

第二题:
https://leetcode-cn.com/problems/chou-shu-lcof/

其实刚开始看到题,思路是他既然说了只包括质因子2、3、5,那么我就从头开始遍历,如果这个数是对2取余为0,他不一定为丑数,比如他可以是70。他如果是丑数,那么只能由2乘以2、2乘以3、2乘以5、3乘以5、2乘以3乘以5…得到,所以需要考虑的判断条件就超级多。
在力扣参考了一些大佬的题解后,参差不齐,总是有一点小小的懵。不过这位大佬讲解的比较清楚:https://blog.csdn.net/qq_17593855/article/details/121012178
他文中有这样一句话:因为每个丑数都是通过一些2一些3一些5生成的,那么,如果我想要生成下一个丑数肯定是是在之前的所有丑数分别乘2乘3乘5得到的比上一个丑数大的数中最小的

我们来看一个图:

/*仿照此位大佬思路: https://blog.csdn.net/qq_17593855/article/details/121012178*/ 

class Solution {
    public int nthUglyNumber(int n) {
        if(n < 2){
            return n; /* 返回 1 */ 
        }
        int a = 0, b = 0, c = 0;
        int[] Array = new int[n];
        Array[0] = 1;
        int i;
        for(i = 1; i < n; i++){
            int n1 = Array[a] * 2;
            int n2 = Array[b] * 3;
            int n3 = Array[c] * 5;
            int temp = Math.min(Math.min(n1,n2),n3);  /* 核心思想,上面有图解 */ 
            Array[i] = temp;
           
           if(n1 <= temp)
                a++;
            if(n2 <= temp)
                b++;
            if(n3 <= temp)
                c++;
        }
        return Array[n - 1]; /* 注意下标 */ 
    }
}

有问题欢迎留言,欢迎加入“万人千题”社区,在这里一起努力。

以上是关于题解《算法零基础100讲》(第7讲---丑数) (java版)的主要内容,如果未能解决你的问题,请参考以下文章

题解《算法零基础100讲》(第16讲) 变量交换算法(java版)

题解《算法零基础100讲》(第8讲) 素数筛选(java版)

题解《算法零基础100讲》(第17讲) 线性枚举 - 最值算法(java版)

题解《算法零基础100讲》(第9讲) 算术基本定理(java版)

题解《算法零基础100讲》(第15讲) 二分快速幂(java版)

题解《算法零基础100讲》(第26讲) 字符串算法 - 回文串(java版)