Nombre de palindrome LeetCode 09

Palindrome


Lien thématique:

https://leetcode-cn.com/problems/palindrome-number/

Description du titre

Déterminez si un entier est un palindrome. Le nombre palindrome fait référence au même entier dans l'ordre positif (de gauche à droite) et dans l'ordre inverse (de droite à gauche).

Exemple:

Exemple 1:
Entrée: 121
Sortie: vrai

Exemple 2:
Entrée: -121
Sortie: faux
Explication: Lecture de gauche à droite, c'est -121. En lisant de droite à gauche, c'est 121-. Ce n'est donc pas un palindrome.

Exemple 3:
Entrée: 10
Sortie: faux
Explication: Lecture de droite à gauche, c'est 01. Ce n'est donc pas un palindrome.

Avancé: pouvez-vous résoudre ce problème sans convertir des entiers en chaînes?

Sujet détaillé

Le titre de cette question est très clair: déterminez s'il s'agit d'un palindrome. Si c'est le cas, il renvoie vrai , si ce n'est pas le cas, il renvoie faux . Faites attention aux deux points suivants:

  • Prenons le cas d'un nombre négatif: s'il s'agit d'un nombre négatif, renvoyez directement false , car un nombre négatif ne peut pas être un palindrome;
  • Déterminez s'il existe une situation de début de zéro (le zéro de début fait référence à la situation où le premier chiffre du nombre est 0, par exemple 0111, 022). Dans ce cas, renvoyez simplement false directement .

Plan de résolution de problèmes

Idée 1: Complexité temporelle: O (N) Complexité spatiale: O (N)

Ce sujet est relativement simple, examinons d'abord le processus d'exécution du code:

  1. Jugez si x est un nombre négatif et renvoyez directement s'il s'agit d'un nombre négatif;
  2. Inverser x , si la valeur inversée est différente de la valeur d'origine, renvoie false directement ;
  3. S'il ne s'agit pas d'un nombre négatif et qu'il est égal à la valeur inversée, il renvoie vrai .

Regardons le code ci-dessous:

class Solution {
    
    
    public boolean isPalindrome(int x) {
    
    
        if (x < 0) {
    
     // 排除小于0的数
            return false;
        }
        String str = String.valueOf(x);
        int n = str.length();
        for (int i = 0; i < n; i++) {
    
    
            if (str.charAt(i) != str.charAt(n - 1 - i)) {
    
     // 通过字符串前后对应字符比较,对比数字是否相等就行
                return false;
            }
        }
        return true;
    }
}

La complexité temporelle et spatiale de l'Idée 1 sont toutes deux O (N), y a-t-il donc un moyen de l'optimiser?

La réponse est oui. Vous vous souvenez de la dernière phrase de la description du contenu?

Pouvez-vous résoudre ce problème sans convertir des entiers en chaînes? Résolvons ce problème en ne convertissant pas les entiers en chaînes.

Idée 2: Complexité temporelle: O (1) Complexité spatiale: O (1)

Tout à l'heure, dans l'Idée 1, nous avons converti des entiers en chaînes. Maintenant, nous ne les convertissons pas. Nous utilisons directement le type entier pour déterminer s'il s'agit d'un palindrome. Tout d'abord, les nombres négatifs ne sont certainement pas des nombres palindromes, donc inutile de le dire. Deuxièmement, si un nombre est un entier positif et peut être divisible par 10, alors ce nombre n'est pas un palindrome, car le premier chiffre du palindrome n'est certainement pas 0.

Alors, que dois-je faire sans convertir l'entier en chaîne? Rappelez-vous l' inverse entier ?

C'est vrai, nous inversons simplement l'entier et le comparons à la valeur d'origine.

Cela réduit considérablement la complexité temporelle et spatiale de l'idée 1. Regardons le code spécifique ci-dessous:

class Solution {
    
    
    public boolean isPalindrome(int x) {
    
    
        if (x < 0) {
    
     // 负数肯定不是palindrome
            return false;
        }
        int temp = x;
        // 翻转之后的数字可能超过整型的范围
        long y = 0;
        while ( x != 0) {
    
    
            y = y * 10 + x % 10;
            x /= 10;
        }
        return  temp == y;
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/weixin_38478780/article/details/108431375
conseillé
Classement