479. Произведение максимальных палиндромных чисел: задачи перечисления.

Привыкайте писать вместе! Это 16-й день моего участия в «Новом ежедневном плане Nuggets · Апрельское задание по обновлению», нажмите, чтобы просмотреть подробности мероприятия .

Описание темы

Это 479. Максимальный палиндромный продукт в LeetCode на высокой сложности .

Тег : "перечисление", "математика"

задано целое число н н возврат может быть выражен как два н н  -битных целых чисел.

Поскольку ответ может быть очень большим, верните его для 1337 1337 Доп.

Пример 1:

输入:n = 2

输出:987

解释:99 x 91 = 9009, 9009 % 1337 = 987
复制代码

Пример 2:

输入: n = 1

输出: 9
复制代码

намекать:

  • 1 < знак равно н < знак равно 8 1 <= п <= 8

Перечисление + Математика

для цифр н н количество цифр в произведении равно либо 2 * н 2*н , либо 2 * н 1 2 * п - 1

когда цифровой н > 1 п > 1 , мы всегда можем 2 * н 2*н .

Используя характеристики палиндрома, нам нужно только перебрать первую половину палиндрома (вторая половина определяется однозначно), и нам нужно только следовать «от большого к меньшему» при переборе первой половины, чтобы убедиться, что найденные первым допустимым значением является наибольшее число, а для цифры н н Максимальное число 1 0 н 1 10^n - 1

具体的,当枚举到回文串的前半部分 я i 时,我们利用回文串特性构造出具实际的回文数值 н ты м s nums ,随后检查 n u m s nums 能否分解成数位为 n n 的数对 ( a , b ) (a, b) ,利用乘法具有交换律,我们只需要枚举数对中的较大数即可。

代码:

class Solution {
    public int largestPalindrome(int n) {
        if (n == 1) return 9;
        int max = (int) Math.pow(10, n) - 1;
        for (int i = max; i >= 0; i--) {
            long num = i, t = i;
            while (t != 0) {
                num = num * 10 + (t % 10);
                t /= 10;
            }
            for (long j = max; j * j >= num; j--) {
                if (num % j == 0) return (int)(num % 1337);
            }
        }
        return -1;
    }
}
复制代码
  • 时间复杂度:枚举回文串的前半部分复杂度为 O ( 1 0 n ) O(10^n) ;检查回文串能否被分解复杂度为 O ( 1 0 n ) O(10^n) 。整体复杂度为 O ( 1 0 2 n ) O(10^{2n})
  • 空间复杂度: O ( 1 ) O(1)

最后

Это первая No.479статья Серия начинается 01.01.2021. На момент начала в LeetCode 1916 вопросов, некоторые из которых заблокированы. Сначала мы разместим все вопросы без замков Тема закрыта.

В этой серии статей, помимо объяснения идей решения проблем, будет дан максимально лаконичный код. Если речь идет об общих решениях, также будут предоставлены соответствующие шаблоны кода.

Чтобы облегчить учащимся отладку и отправку кода на компьютере, я создал соответствующий репозиторий: github.com/SharingSour… .

В адресе склада можно увидеть ссылку на решение серии статей, соответствующий код серии статей, ссылку на исходный вопрос LeetCode и другие предпочтительные решения.

рекомендация

отjuejin.im/post/7087026602332127246
рекомендация