Trouver le Kième bit dans la Nième chaîne binaire

DDD
Libérer: 2024-10-20 06:10:29
original
952 Les gens l'ont consulté

Find Kth Bit in Nth Binary String

1545. Trouver le Kième bit dans la Nième chaîne binaire

Difficulté :Moyen

Sujets : Chaîne, Récursion, Simulation

Étant donné deux entiers positifs n et k, la chaîne binaire Sn se forme comme suit :

  • S1 = "0"
  • Si = Si - 1 "1" reverse(invert(Si - 1)) pour i > 1

Où désigne l'opération de concaténation, reverse(x) renvoie la chaîne inversée x et invert(x) inverse tous les bits de x (0 passe à 1 et 1 passe à 0).

Par exemple, les quatre premières chaînes de la séquence ci-dessus sont :

  • S1 = "0"
  • S2 = "011"
  • S3 = "0111001"
  • S4 = "011100110110001"

Renvoyer le kième bit dans Sn. Il est garanti que k est valable pour le n donné.

Exemple 1 :

  • Entrée : n = 3, k = 1
  • Sortie : "0"
  • Explication :S3 est "0111001". Le 1er bit est "0".

Exemple 2 :

  • Entrée : n = 4, k = 11
  • Sortie : "1"
  • Explication :S4 est "011100110110001". Le 11ème bit est "1".

Exemple 3 :

  • Entrée : n = 3, k = 2
  • Sortie : "0"

Contraintes :

  • 1 <= n <= 20
  • 1 <= k <= 2n - 1

Indice :

  1. Puisque n est petit, nous pouvons simplement simuler le processus de construction de S1 en Sn.

Solution :

Nous devons comprendre le processus récursif utilisé pour générer chaque chaîne binaire Sn et l'utiliser pour déterminer le k-ième bit sans construire l'intégralité chaîne.

Approche:

  1. Construction de chaînes récursives :

    • S1 = "0".
    • Pour moi > 1 :
      • Si est construit comme : Si = Si-1 "1" inverse(inverser(Si-1))
    • Cela signifie Si se compose de trois parties :
      • Si-1 (la pièce d'origine)
      • "1" (le bit du milieu)
      • reverse(invert(Si-1)) (la partie transformée)
  2. Observations clés :

    • Si a une longueur de 2i-1.
    • Le bit du milieu (position 2i-1 de Si est toujours "1".
    • Si k se situe dans la première moitié, il tombe dans Si-1.
    • Si k est exactement la position médiane, la réponse est "1".
    • Si k est dans la seconde moitié, cela correspond à la partie inversée-inverse.
  3. Inversion et inversion :

    • Pour déterminer le bit dans la seconde moitié, mappez k à sa position correspondante dans la première moitié en utilisant : k' = 2i - k
    • Le bit à cette position dans la moitié d'origine est inversé, nous devons donc inverser le résultat.
  4. Solution récursive :

    • Déterminez de manière récursive le k-ème bit en réduisant n et en mappant k jusqu'à n=1.
  5. Implémentons cette solution en PHP : 1545. Trouver le Kième bit dans la Nième chaîne binaire

    <?php
    /**
     * @param Integer $n
     * @param Integer $k
     * @return String
     */
    function findKthBit($n, $k) {
        ...
        ...
        ...
        /**
         * go to ./solution.php
         */
    }
    ?>
    
    Copier après la connexion

    Explication:

    • Cas de base : Si n = 1, Si est "0" , donc la seule valeur possible pour tout k est "0".
    • Étapes récursives :
      • Calculez l'indice du milieu mid qui est 2n-1.
      • Si k correspond à l'index du milieu, renvoie "1".
      • Si k est inférieur au milieu, le k-ème le bit se situe dans la première moitié, nous trouvons donc récursivement le k-ième bit dans Sn-1.
      • Si k est supérieur à mid, on retrouve le bit correspondant dans la seconde moitié inversée et on le retourne.

    Analyse de complexité :

    • Complexité temporelle : O(n) car chaque appel récursif réduit n de 1.
    • Complexité spatiale : O(n) pour la pile d'appels récursifs.

    Exemple de procédure pas à pas :

    1. Entrée : n = 3 , k = 1

      • S3 = "0111001"
      • k = 1 tombe en première mi-temps, on cherche donc k = 1 dans S2.
      • En S2 = "011" , k = 1 correspond à "0".
    2. Entrée : n = 4 , k = 11

      • S4 = "011100110110001"
      • L'indice du milieu pour S4 est 8.
      • k = 11 tombe en seconde période.
      • Mappez k = 11 au bit correspondant dans la première moitié : k' = 2 4 - 11 = 5.
      • Trouvez k = 5 dans S3 , qui vaut "0", puis retournez-le à "1".

    En tirant parti de la récursivité et des propriétés de la construction de la chaîne, cette solution évite de générer la chaîne entière, ce qui la rend efficace même pour les n plus grands.

    Liens de contact

    Si vous avez trouvé cette série utile, pensez à donner une étoile au référentiel sur GitHub ou à partager la publication sur vos réseaux sociaux préférés ?. Votre soutien signifierait beaucoup pour moi !

    Si vous souhaitez du contenu plus utile comme celui-ci, n'hésitez pas à me suivre :

    • LinkedIn
    • GitHub

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!