Table des matières
Énoncé du problème
Exemple
Entrez
Sortie
Instructions
Méthode 2
Algorithme
示例
输出
结论
Maison développement back-end C++ Différents nombres obtenus en générant toutes les permutations d'une chaîne binaire

Différents nombres obtenus en générant toutes les permutations d'une chaîne binaire

Sep 04, 2023 pm 09:33 PM
Programmation de chaînes arrangement binaire Génération de numéros

Différents nombres obtenus en générant toutes les permutations dune chaîne binaire

Énoncé du problème

On nous donne une chaîne binaire str de longueur N. Nous devons trouver toutes les permutations de cette chaîne, les convertir en valeurs décimales et renvoyer toutes les valeurs décimales uniques.

Exemple

Entrez

str = ‘1’
Copier après la connexion

Sortie

[1]
Copier après la connexion

Instructions

Toutes les permutations de « 1 » sont simplement « 1 ». La valeur décimale associée à « 1 » est donc égale à 1.

Entrez

str = ‘10’
Copier après la connexion

Sortie

[1, 2]
Copier après la connexion

Instructions

La disposition de « 10 » est uniquement « 01 » et « 10 », qui sont respectivement équivalents à 1 et 2.

Entrez

‘101’
Copier après la connexion

Sortie

[3, 5, 6]
Copier après la connexion

Instructions

Toutes les permutations possibles de "101" sont "110", "101", "110", "011", "101" et "011", si nous les convertissons en nombres décimaux, nous obtenons 3, 5 et 6 décimales uniques. Nombres.

Méthode 1

Dans la première méthode, nous utiliserons le backtracing pour obtenir toutes les permutations de la chaîne binaire. Après cela, nous convertissons la permutation binaire en valeurs décimales et utilisons cet ensemble pour sélectionner la valeur décimale unique. Nous allons convertir le décimal en binaire en utilisant la méthode pow() et la boucle for.

Algorithme

  • Étape 1 - Définissez la fonction "getDecimalPermutations()" pour obtenir la valeur décimale résultante.

  • Étape 2 - Exécutez la fonction "getBinaryPermutations()" pour obtenir toutes les permutations binaires de la chaîne. De plus, les chaînes, les index gauche et droit et les vecteurs de permutation sont transmis comme arguments.

  • Étape 2.1 - Dans la fonction "getBinaryPermutations()", si les indices gauche et droit sont égaux, poussez la chaîne résultante dans la liste permutée.

  • Étape 2.2 - Si les indices gauche et droit ne sont pas égaux, utilisez une boucle for pour parcourir la chaîne de l'index gauche à l'index droit.

  • Étape 2.3 - Échangez les caractères au i-ème index et à l'index gauche dans la boucle for.

  • Étape 2.4 - Appelez à nouveau la fonction "getBinaryPermutations" avec les mêmes paramètres et l'index "gauche + 1".

  • Étape 2.5 - Échangez les caractères au i-ème index et à l'index de gauche à des fins de retour en arrière.

  • Étape 3 - Créez une collection appelée "allDecimals". Après cela, parcourez toutes les permutations de la chaîne binaire.

  • Étape 4 - Appelez la fonction bToD() pour convertir le binaire en décimal.

  • Étape 4.1 - Dans la fonction bToD(), initialisez la variable décimale avec la valeur 0.

  • Étape 4.2 - Utilisez une boucle for pour parcourir la chaîne binaire en commençant par la fin et ajoutez '(num[i] - '0') * pow(2, j )' pour la convertir en valeur décimale.

  • Étape 4.3 - Renvoie la valeur décimale.

  • Étape 5 - Dans la fonction "getDecimalPermutations", insérez la valeur décimale renvoyée par la fonction bToD().

  • Étape 6 - Imprimez toutes les valeurs de l'ensemble, qui contiendront des valeurs décimales uniques.

Exemple

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
// Function to convert binary to decimal
int bToD(string num){
   int decimal = 0;
   for (int i = num.size() - 1, j = 0; i >= 0; i--, j++){
      decimal += (num[i] - '0') * pow(2, j);
   }
   return decimal;
}
// Function to get all permutations of a binary string
void getBinaryPermutations(string str, int left, int right, vector<string> &permutations){
   // Base case
   if (left == right){
      // push_back() function is used to push elements into a vector from the back
      permutations.push_back(str);
   } else {
      // Permutations made
      for (int i = left; i <= right; i++){
         // Swapping done
         swap(str[left], str[i]);
         // Recursion called for next index (left + 1)
         getBinaryPermutations(str, left + 1, right, permutations);
         // Backtrack
         swap(str[left], str[i]);
      }
   }
}
void getDecimalPermutations(string str){
   vector<string> permutations;
   getBinaryPermutations(str, 0, str.length() - 1, permutations);
   set<int> allDecimals;
   for (const auto &p : permutations){
      allDecimals.insert(bToD(p));
   }
   cout << "All decimal numbers which we can achieve using permutations are " << endl;
   for (const auto &d : allDecimals){
      cout << d << " ";
   }
}
int main(){
   string bString = "101";
   getDecimalPermutations(bString);
   return 0;
}
Copier après la connexion

Sortie

All decimal numbers which we can achieve using permutations are 
3 5 6
Copier après la connexion
Copier après la connexion
  • Complexité temporelle - O(n!). La complexité temporelle de la fonction « getBinaryPermutations() » est « n ! » car nous utilisons le backtracking pour trouver toutes les permutations. La complexité temporelle de la fonction bToD() est O(n).

  • Complexité spatiale - O(n!). Chaque chaîne a n!permutations que nous stockons dans la liste.

Méthode 2

Dans cette méthode, au lieu de la méthode de retour en arrière, nous utiliserons la fonction next_permutation() de C++ pour générer la permutation de chaîne binaire. De plus, nous avons modifié la méthode de conversion binaire en décimal.

Algorithme

  • Étape 1 - Définissez l'ensemble "allNumbers".

  • Étape 2 - La méthode sort() est utilisée pour trier les chaînes binaires.

  • Étape 3 - Utilisez une boucle do-while pour parcourir chaque permutation de la chaîne.

  • Étape 4 - Dans la boucle do-while, appelez la fonction bToD() en passant une chaîne comme paramètre pour convertir le binaire en nombre décimal.

  • Étape 4.1 - Dans la fonction bToD(), définissez la variable "currentBase" et initialisez-la à 1.

  • Étape 4.2 - Utilisez une boucle for et parcourez la chaîne en commençant par le dernier index.

  • Étape 4.3 - Dans la boucle for, si le caractère actuel est égal à « 1 », nous devons ajouter la valeur currentBase au « nombre_décimal ».

    < /里>
  • Étape 4.4 - Multipliez currentBase par 2.

  • Étape 5 - Insérez le nombre décimal dans l'ensemble "allNumber".

  • Étape 6 - Utilisez la méthode next_permutation() dans la condition de la boucle do-while car elle retournera vrai si la prochaine permutation de la chaîne existe.

  • Étape 7 - Imprimez tous les nombres ajoutés dans "allNumbers" pour obtenir des nombres décimaux uniques associés à toutes les permutations de la chaîne binaire donnée.

示例

#include <iostream>
#include <algorithm>
#include <set>

using namespace std;
int bToD(string num){
   int decimal_number = 0;
   // Initializing base value to 1, and it increases by power of 2 in each iteration
   int currentBase = 1;
   for (int i = num.length() - 1; i >= 0; i--){
      if (num[i] == '1'){
         decimal_number += currentBase;
      }
      currentBase = currentBase * 2;
   }
   return decimal_number;
}
void getDecimalPermutations(string str){
   // create set
   set<int> allNumbers;
   // sort the string
   sort(str.begin(), str.end());
   do {
      // convert binary string to decimal
      int result = bToD(str);
      // insert the decimal number to set
      allNumbers.insert(result);
      // get the next permutation
   } while (next_permutation(str.begin(), str.end()));
   //Print all distinct decimal numbers
   cout << "All decimal numbers which we can achieve using permutations are " << endl;
   for (auto num : allNumbers)
      cout << num << " ";
      cout << endl;
}
int main(){
   string bString = "101";
   getDecimalPermutations(bString);
   return 0;
}
Copier après la connexion

输出

All decimal numbers which we can achieve using permutations are 
3 5 6
Copier après la connexion
Copier après la connexion
  • 时间复杂度 - O(n*n!)。这里,next_permutations() 需要 O(n) 时间来找到一个排列,并且我们正在找到总共 n!排列。

  • 空间复杂度 - O(n!),因为我们将所有排列存储在列表中。

结论

我们学习了不同的方法来获取通过给定二进制字符串的所有排列获得的唯一十进制值。在第一种方法中,我们使用了回溯;在第二种方法中,我们使用了 next_permutation() 方法。

第二种方法的代码更清晰,但需要更多的时间和复杂性。

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
1 Il y a quelques mois By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

C Structure des données du langage: représentation des données et fonctionnement des arbres et des graphiques C Structure des données du langage: représentation des données et fonctionnement des arbres et des graphiques Apr 04, 2025 am 11:18 AM

C Structure des données du langage: La représentation des données de l'arborescence et du graphique est une structure de données hiérarchique composée de nœuds. Chaque nœud contient un élément de données et un pointeur vers ses nœuds enfants. L'arbre binaire est un type spécial d'arbre. Chaque nœud a au plus deux nœuds enfants. Les données représentent StrustReenode {intdata; structTreenode * gauche; structureReode * droite;}; L'opération crée une arborescence d'arborescence arborescence (prédécision, ordre dans l'ordre et ordre ultérieur) Le nœud d'insertion de l'arborescence des arbres de recherche de nœud Graph est une collection de structures de données, où les éléments sont des sommets, et ils peuvent être connectés ensemble via des bords avec des données droites ou peu nombreuses représentant des voisins.

La vérité derrière le problème de fonctionnement du fichier de langue C La vérité derrière le problème de fonctionnement du fichier de langue C Apr 04, 2025 am 11:24 AM

La vérité sur les problèmes de fonctionnement des fichiers: l'ouverture des fichiers a échoué: les autorisations insuffisantes, les mauvais chemins de mauvais et les fichiers occupés. L'écriture de données a échoué: le tampon est plein, le fichier n'est pas écrivatif et l'espace disque est insuffisant. Autres FAQ: traversée de fichiers lents, encodage de fichiers texte incorrect et erreurs de lecture de fichiers binaires.

Comment utiliser efficacement les références RValue en C? Comment utiliser efficacement les références RValue en C? Mar 18, 2025 pm 03:29 PM

L'article discute de l'utilisation efficace des références de référence en C pour la sémantique de déplacement, le transfert parfait et la gestion des ressources, mettant en évidence les meilleures pratiques et les améliorations des performances. (159 caractères)

Quelles sont les exigences de base pour les fonctions de langue C Quelles sont les exigences de base pour les fonctions de langue C Apr 03, 2025 pm 10:06 PM

Les fonctions de langue C sont la base de la modularisation du code et de la construction de programmes. Ils se composent de déclarations (en-têtes de fonction) et de définitions (corps de fonction). Le langage C utilise des valeurs pour transmettre les paramètres par défaut, mais les variables externes peuvent également être modifiées à l'aide d'adresse Pass. Les fonctions peuvent avoir ou ne pas avoir de valeur de retour et le type de valeur de retour doit être cohérent avec la déclaration. La dénomination de la fonction doit être claire et facile à comprendre, en utilisant un chameau ou une nomenclature de soulignement. Suivez le principe de responsabilité unique et gardez la simplicité de la fonction pour améliorer la maintenabilité et la lisibilité.

Comment utiliser les plages dans C 20 pour une manipulation de données plus expressive? Comment utiliser les plages dans C 20 pour une manipulation de données plus expressive? Mar 17, 2025 pm 12:58 PM

Les plages de c 20 améliorent la manipulation des données avec l'expressivité, la composibilité et l'efficacité. Ils simplifient les transformations complexes et s'intègrent dans les bases de code existantes pour de meilleures performances et maintenabilité.

Comment calculer C-SUBScript 3 Indice 5 C-SUBScript 3 Indice Indice 5 Tutoriel d'algorithme Comment calculer C-SUBScript 3 Indice 5 C-SUBScript 3 Indice Indice 5 Tutoriel d'algorithme Apr 03, 2025 pm 10:33 PM

Le calcul de C35 est essentiellement des mathématiques combinatoires, représentant le nombre de combinaisons sélectionnées parmi 3 des 5 éléments. La formule de calcul est C53 = 5! / (3! * 2!), Qui peut être directement calculé par des boucles pour améliorer l'efficacité et éviter le débordement. De plus, la compréhension de la nature des combinaisons et la maîtrise des méthodes de calcul efficaces est cruciale pour résoudre de nombreux problèmes dans les domaines des statistiques de probabilité, de la cryptographie, de la conception d'algorithmes, etc.

Comment utiliser Move Semantics en C pour améliorer les performances? Comment utiliser Move Semantics en C pour améliorer les performances? Mar 18, 2025 pm 03:27 PM

L'article discute de l'utilisation de Move Semantics en C pour améliorer les performances en évitant la copie inutile. Il couvre la mise en œuvre de constructeurs de déplace

Comment le répartition dynamique fonctionne-t-il en C et comment affecte-t-il les performances? Comment le répartition dynamique fonctionne-t-il en C et comment affecte-t-il les performances? Mar 17, 2025 pm 01:08 PM

L'article traite de Dynamic Dispatch in C, ses coûts de performance et les stratégies d'optimisation. Il met en évidence les scénarios où la répartition dynamique a un impact

See all articles