Палиндром Объяснение - PullRequest
0 голосов
/ 15 января 2020

Я обнаружил следующее в статье leetcode , чтобы определить, является ли целое число палиндромом

Теперь давайте подумаем, как вернуть последнюю половину числа. Для числа 1221, если мы сделаем 1221% 10, мы получим последний ди git 1, чтобы получить секунду до последнего ди git, нам нужно удалить последний ди git из 1221, мы могли бы сделать это разделив его на 10, 1221/10 = 122. Затем мы можем снова получить последний ди git, выполнив модуль на 10, 122% 10 = 2, и если мы умножим последний ди git на 10 и добавим второй последний di git, 1 * 10 + 2 = 12, он дает нам обратное число, которое мы хотим. Продолжение этого процесса даст нам возвращенное число с большим количеством цифр.

Теперь вопрос в том, откуда мы знаем, что мы достигли половины числа?

Поскольку мы разделили число на 10, и умноженное обратное число на 10, когда исходное число меньше обратного числа, это означает, что мы обработали половину цифр числа.

Может кто-нибудь объяснить последние два предложения пожалуйста?! Спасибо!

Вот прилагаемый C# код:

public class Solution {
    public bool IsPalindrome(int x) {
        // Special cases:
        // As discussed above, when x < 0, x is not a palindrome.
        // Also if the last digit of the number is 0, in order to be a palindrome,
        // the first digit of the number also needs to be 0.
        // Only 0 satisfy this property.
        if(x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }

        int revertedNumber = 0;
        while(x > revertedNumber) {
            revertedNumber = revertedNumber * 10 + x % 10;
            x /= 10;
        }

        // When the length is an odd number, we can get rid of the middle digit by revertedNumber/10
        // For example when the input is 12321, at the end of the while loop we get x = 12, revertedNumber = 123,
        // since the middle digit doesn't matter in palidrome(it will always equal to itself), we can simply get rid of it.
        return x == revertedNumber || x == revertedNumber/10;
    }
}

1 Ответ

0 голосов
/ 15 января 2020

Причина в том, что исходные данные вводятся, x будет уменьшаться на 1 di git, тогда как возвращаемая строка увеличивается на 1 di git одновременно. Процесс продолжается до тех пор, пока x не станет меньше или равно возвращенной строке. Следовательно, из-за изменения длины изменения, когда оно завершится, мы достигнем приблизительно половины строки.

Давайте рассмотрим несколько примеров с положительными числами, чтобы понять процесс. Я бы написал (х, у) как (исходный номер, перевернутая строка). Третий пример специально разработан для того, чтобы показать, что он не обязательно должен быть ровно наполовину, но код все равно будет работать.

  • Первый пример - 1221, где есть четное количество цифр. Она будет go от (1221, 0) до (122, 1) до (12, 12), на этом этапе оба члена равны, и, следовательно, процесс завершается, и мы можем заключить, что это палиндром.

  • Следующий пример - 1223, где есть четное количество цифр. Она будет go от (1223, 0) до (122, 3) и (12, 32), на этом этапе условие завершения выполняется и, следовательно, процесс завершается, и мы можем сделать вывод, что это не палиндром.

  • Теперь третий пример - 1211, затем последовательность (1211,0), (121, 1), (12,11), (1,112), после чего мы заканчиваем с Строка и будет заключить, что это не палиндром

Теперь давайте сделаем число состоит из нечетного числа цифр:

  • Для 12321 Он будет go с (12321, 0) до (1232, 1) до (123, 12) до (12, 123) и в этот момент условие нарушается. Затем мы делим перевернутую строку на 10 и в итоге получаем (12,12), и мы можем заключить, что это палиндром.

  • Для 12323. Это будет go от ( 12323, 0) - (1232, 3) - (123, 32) - (12, 323), и в этот момент условие нарушается. Затем мы делим возвращенную строку на 10, и в итоге получаем (12,32), и мы можем заключить, что это не палиндром.

  • Для 12311. Это будет go из (12311, 0) - (1231, 1) - (123, 11) - (12, 113), и в этот момент условие нарушается. Затем мы делим перевернутую строку на 10 и в итоге получаем (12,11), и мы можем заключить, что это не палиндром.

Надеюсь, что эти примеры помогут вам понять что означает этот пост.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...