0
点赞
收藏
分享

微信扫一扫

Java&C++题解与拓展——leetcode479.最大回文数乘积【暴力破解么的新知识】

一条咸鱼的干货 2022-04-16 阅读 42
每日一题做题记录,参考官方和三叶的题解

文章目录

题目要求

image.png

思路:暴力

n n n位数的乘积最大是 2 n 2n 2n位,所以在 2 n 2n 2n范围内找最大的符合条件的数就行了:

  • n = 1 n=1 n=1,直接返回 9 9 9
  • n > 1 n>1 n>1,从大到小枚举所有的回文串,判断是否能拆解为两个 n n n位数的乘积。
    • 枚举时只要枚举前半部分就好(回文所以后半部分反过来就好),前半部分刚好是 n n n位,所以从最大的 n n n位数 m a x max max开始枚举。
    • 拆解时也只需要从大到小去试(较大者),然后除出另一个结果(较小者),到当前数的平方都小于目标时,说明再小的数更不可能满足条件,所以跳出循环。

Java

class Solution {
    public int largestPalindrome(int n) {
        if(n == 1)
            return 9; //特殊处理
        int max = (int) Math.pow(10,n) - 1; //n位最大数
        for(int i = max; i > 0; i--) {
            long pd = i, t = i;
            //拼接回文数
            while(t != 0) {
                pd = pd * 10 + (t % 10);
                t /= 10;
            }
            //计算是否能拆成两个数
            for(long j = max; j * j >= pd; j--)
                if(pd % j == 0)
                    return (int)(pd % 1337);
        }
        return -1;
    }
}
  • 时间复杂度: O ( 1 0 2 n ) O(10^{2n}) O(102n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

C++

class Solution {
public:
    int largestPalindrome(int n) {
        if(n == 1)
            return 9; //特殊处理
        int max = pow(10,n) - 1; //n位最大数
        for(int i = max; i > 0; i--) {
            long pd = i, t = i;
            //拼接回文数
            while(t != 0) {
                pd = pd * 10 + (t % 10);
                t /= 10;
            }
            // 计算是否能拆成两个数
            for(long j = max; j * j >= pd; j--)
                if(pd % j == 0)
                    return (int)(pd % 1337);
        }
        return -1;
    }
};
  • 时间复杂度: O ( 1 0 2 n ) O(10^{2n}) O(102n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

总结

……恶心困难题,竟然是靠四舍五入暴力方法,还不如做个简单题开心有收获……

【话说数据范围是 1 ∼ 8 1\sim8 18,评论里出现了一堆面向测试的解决方案更快乐一点】


欢迎指正与讨论!
举报

相关推荐

0 条评论