Jadual Kandungan
Pernyataan Masalah
Contoh
Masuk
Output
Arahan
Kaedah 2
Algoritma
示例
输出
结论
Rumah pembangunan bahagian belakang C++ Nombor berbeza diperoleh dengan menjana semua pilih atur rentetan binari

Nombor berbeza diperoleh dengan menjana semua pilih atur rentetan binari

Sep 04, 2023 pm 09:33 PM
Pengaturcaraan rentetan susunan binari Penjanaan nombor

Nombor berbeza diperoleh dengan menjana semua pilih atur rentetan binari

Pernyataan Masalah

Kami diberi rentetan binari str panjang N. Kita perlu mencari semua pilih atur rentetan ini, menukarnya kepada nilai perpuluhan dan mengembalikan semua nilai perpuluhan yang unik.

Contoh

Masuk

str = ‘1’
Salin selepas log masuk

Output

[1]
Salin selepas log masuk

Arahan

Semua pilih atur "1" hanyalah "1". Oleh itu, nilai perpuluhan yang dikaitkan dengan "1" adalah sama dengan 1.

Masuk

str = ‘10’
Salin selepas log masuk

Output

[1, 2]
Salin selepas log masuk

Arahan

Susunan '10' hanyalah '01' dan '10', iaitu bersamaan dengan 1 dan 2 masing-masing.

Masuk

‘101’
Salin selepas log masuk

Output

[3, 5, 6]
Salin selepas log masuk

Arahan

Semua pilih atur yang mungkin bagi "101" ialah "110", "101", "110", "011", "101" dan "011", jika kita menukarnya kepada nombor perpuluhan kita mendapat 3, 5 dan 6 perpuluhan unik nombor.

Kaedah 1

Dalam kaedah pertama, kami akan menggunakan penjejakan belakang untuk mendapatkan semua pilih atur rentetan binari. Selepas itu, kami menukar pilih atur binari kepada nilai perpuluhan dan menggunakan set ini untuk memilih nilai perpuluhan yang unik. Kami akan menukar perpuluhan kepada binari menggunakan kaedah pow() dan untuk gelung.

Algoritma

  • Langkah 1 - Takrifkan fungsi "getDecimalPermutations()" untuk mendapatkan nilai perpuluhan yang terhasil.

  • Langkah 2 - Jalankan fungsi "getBinaryPermutations()" untuk mendapatkan semua pilih atur binari rentetan. Selain itu, rentetan, indeks kiri dan kanan serta vektor pilih atur diluluskan sebagai hujah.

  • Langkah 2.1 - Dalam fungsi "getBinaryPermutations()", jika indeks kiri dan kanan adalah sama, tolak rentetan yang terhasil ke dalam senarai diubah suai.

  • Langkah 2.2 - Jika indeks kiri dan kanan tidak sama, gunakan gelung for untuk mengulang rentetan dari indeks kiri ke indeks kanan.

  • Langkah 2.3 - Tukar aksara pada indeks ke-i dan indeks kiri dalam gelung untuk.

  • Langkah 2.4 - Panggil fungsi "getBinaryPermutations" sekali lagi dengan parameter yang sama dan indeks "kiri + 1".

  • Langkah 2.5 - Tukar aksara pada indeks ke-i dan indeks kiri untuk tujuan menjejak ke belakang.

  • Langkah 3 - Buat koleksi yang dipanggil "allDecimals". Selepas itu, ulangi semua pilihatur rentetan binari.

  • Langkah 4 - Panggil fungsi bToD() untuk menukar binari kepada perpuluhan.

  • Langkah 4.1 - Dalam fungsi bToD(), mulakan pembolehubah perpuluhan dengan nilai 0.

  • Langkah 4.2 - Gunakan gelung for untuk mengulang rentetan binari bermula dari hujung dan tambah '(num[i] - '0') * pow(2, j )' untuk menukar kepada nilai perpuluhan.

  • Langkah 4.3 - Kembalikan nilai perpuluhan.

  • Langkah 5 - Dalam fungsi "getDecimalPermutations", masukkan nilai perpuluhan yang dikembalikan daripada fungsi bToD().

  • Langkah 6 - Cetak semua nilai set, yang akan mengandungi nilai perpuluhan unik.

Contoh

#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;
}
Salin selepas log masuk

Output

All decimal numbers which we can achieve using permutations are 
3 5 6
Salin selepas log masuk
Salin selepas log masuk
  • Kerumitan masa - O(n!). Kerumitan masa bagi fungsi "getBinaryPermutations()" ialah "n!" Kerumitan masa bagi fungsi bToD() ialah O(n).

  • Kerumitan ruang - O(n!). Setiap rentetan mempunyai n!permutasi yang kami simpan dalam senarai.

Kaedah 2

Dalam kaedah ini, bukannya kaedah backtracking, kami akan menggunakan fungsi next_permutation() C++ untuk menjana pilih atur rentetan binari. Selain itu, kami menukar kaedah menukar binari kepada perpuluhan.

Algoritma

  • Langkah 1 - Tentukan set "semuaNombor".

  • Langkah 2 - kaedah sort() digunakan untuk mengisih rentetan binari.

  • Langkah 3 - Gunakan gelung do-while untuk mengulangi setiap pilih atur rentetan.

  • Langkah 4 - Dalam gelung do-while, panggil fungsi bToD() dengan menghantar rentetan sebagai parameter untuk menukar perduaan kepada nombor perpuluhan.

  • Langkah 4.1 - Dalam fungsi bToD(), takrifkan pembolehubah "currentBase" dan mulakannya kepada 1.

  • Langkah 4.2 - Gunakan gelung for dan ulangi rentetan bermula dari indeks terakhir.

  • Langkah 4.3 - Dalam gelung for, jika aksara semasa adalah sama dengan '1', kita perlu menambah nilai currentBase kepada 'decimal_number'.

    < /里>
  • Langkah 4.4 - Darabkan Asas semasa dengan 2.

  • Langkah 5 - Masukkan nombor perpuluhan ke dalam set "allNumber".

  • Langkah 6 - Gunakan kaedah next_permutation() dalam keadaan gelung do-while kerana ia akan kembali benar jika pilih atur rentetan seterusnya wujud.

  • Langkah 7 - Cetak semua nombor yang ditambahkan dalam "allNumbers" untuk mendapatkan nombor perpuluhan unik yang dikaitkan dengan semua pilih atur rentetan binari yang diberikan.

示例

#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;
}
Salin selepas log masuk

输出

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

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

结论

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

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

Atas ialah kandungan terperinci Nombor berbeza diperoleh dengan menjana semua pilih atur rentetan binari. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Bagaimana Perpustakaan Templat St Standard (STL) berfungsi? Mar 12, 2025 pm 04:50 PM

Artikel ini menerangkan Perpustakaan Templat St Standard (STL), yang memberi tumpuan kepada komponen terasnya: bekas, iterator, algoritma, dan functors. Ia memperincikan bagaimana ini berinteraksi untuk membolehkan pengaturcaraan generik, meningkatkan kecekapan kod dan kebolehbacaan t

Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap? Bagaimanakah saya menggunakan algoritma dari STL (jenis, mencari, mengubah, dll) dengan cekap? Mar 12, 2025 pm 04:52 PM

Artikel ini memperincikan penggunaan algoritma STL yang cekap dalam c. Ia menekankan pilihan struktur data (vektor vs senarai), analisis kerumitan algoritma (mis., Std :: Sort vs Std :: partial_sort), penggunaan iterator, dan pelaksanaan selari. Perangkap biasa seperti

Bagaimana saya mengendalikan pengecualian dengan berkesan di C? Bagaimana saya mengendalikan pengecualian dengan berkesan di C? Mar 12, 2025 pm 04:56 PM

Artikel ini butiran pengendalian pengecualian yang berkesan di C, meliputi percubaan, menangkap, dan membuang mekanik. Ia menekankan amalan terbaik seperti RAII, mengelakkan blok tangkapan yang tidak perlu, dan pengecualian pembalakan untuk kod yang mantap. Artikel ini juga menangani perf

Bagaimanakah saya menggunakan semantik bergerak di C untuk meningkatkan prestasi? Bagaimanakah saya menggunakan semantik bergerak di C untuk meningkatkan prestasi? Mar 18, 2025 pm 03:27 PM

Artikel ini membincangkan menggunakan semantik Move dalam C untuk meningkatkan prestasi dengan mengelakkan penyalinan yang tidak perlu. Ia meliputi pelaksanaan pembina bergerak dan pengendali tugasan, menggunakan STD :: bergerak, dan mengenal pasti senario utama dan perangkap untuk Appl yang berkesan

Bagaimanakah saya menggunakan julat dalam C 20 untuk manipulasi data yang lebih ekspresif? Bagaimanakah saya menggunakan julat dalam C 20 untuk manipulasi data yang lebih ekspresif? Mar 17, 2025 pm 12:58 PM

C 20 julat meningkatkan manipulasi data dengan ekspresi, komposiliti, dan kecekapan. Mereka memudahkan transformasi kompleks dan mengintegrasikan ke dalam kod sedia ada untuk prestasi dan kebolehkerjaan yang lebih baik.

Bagaimanakah penghantaran dinamik berfungsi di C dan bagaimana ia mempengaruhi prestasi? Bagaimanakah penghantaran dinamik berfungsi di C dan bagaimana ia mempengaruhi prestasi? Mar 17, 2025 pm 01:08 PM

Artikel ini membincangkan penghantaran dinamik dalam C, kos prestasinya, dan strategi pengoptimuman. Ia menyoroti senario di mana penghantaran dinamik memberi kesan kepada prestasi dan membandingkannya dengan penghantaran statik, menekankan perdagangan antara prestasi dan

Bagaimanakah saya menggunakan rujukan RValue dengan berkesan di C? Bagaimanakah saya menggunakan rujukan RValue dengan berkesan di C? Mar 18, 2025 pm 03:29 PM

Artikel membincangkan penggunaan rujukan RValue yang berkesan dalam C untuk bergerak semantik, pemajuan sempurna, dan pengurusan sumber, menonjolkan amalan terbaik dan penambahbaikan prestasi. (159 aksara)

Bagaimanakah pengurusan memori C berfungsi, termasuk petunjuk baru, memadam, dan pintar? Bagaimanakah pengurusan memori C berfungsi, termasuk petunjuk baru, memadam, dan pintar? Mar 17, 2025 pm 01:04 PM

Pengurusan memori C menggunakan petunjuk baru, memadam, dan pintar. Artikel ini membincangkan manual vs pengurusan automatik dan bagaimana penunjuk pintar menghalang kebocoran memori.

See all articles