Új hozzászólás Aktív témák
-
joysefke
veterán
válasz
pmonitor
#9466
üzenetére
Átírva C#-ba és használható formában
A kezdeti 1x tömb-klónozáson kívül (hogy ne legyen elrontva a bemeneti tömb) teljesen allokációmentes.
A char[] State tárolja az aktuális állapotot, a bool Next() pedig lépteti az és visszajelez a sikerről. Ha a char[] State állapotot nem csak olvasni akarod akkor értelemszerűen ki kell menteni róla egy másolatot.A char[] State köré lehetne még valami readonly wrappert rakni, de azt nem tudom hogy viselkedne.
char[] megy bele ctor bemeneti paraméterként
És ezen még lehetne gyorsítani.

using System;namespace Permutator{class Program{static void Main(string[] args){int i = 0;var p = new Permutator("abcdananana".ToCharArray());do{i++;Console.WriteLine(new string(p.State));}while (p.Next());Console.WriteLine($"Nr of results: {i}");}}public class Permutator{public char[] State { get; }int _size;bool isFinished = false;public Permutator(char[] symbols){if (symbols?.Length > 0){_size = symbols.Length;State = (char[])symbols.Clone();Array.Sort(State);}elsethrow new ArgumentException("input must be non-empty");}public bool Next(){// if we have already finished we indicate failure on getting next element// else we try to advance the state and propagate success of advancing stateif (isFinished)returnfalse;isFinished = !AdvanceState();return !isFinished;}bool AdvanceState(){// Find the rightmost character// which is smaller than its next// character. Let us call it 'first// char'int i;for (i = _size - 2; i >= 0; --i)if (State[i] < State[i + 1])break;// If there is no such character, all// are sorted in decreasing order,// means we just printed the last// permutation and we are done.if (i == -1)return false;// Find the ceil of 'first char'// in right of first character.// Ceil of a character is the// smallest character greater// than itint ceilIndex = findCeil(State, State[i], i + 1, _size - 1);char tmp = State[i];State[i] = State[ceilIndex];State[ceilIndex] = tmp;Array.Sort(State, i + 1, _size - i - 1);return true;}// This function finds the index of the// smallest character which is greater// than 'first' and is present in str[l..h]int findCeil(char[] str, char first, int l, int h){// initialize index of ceiling elementint ceilIndex = l;// Now iterate through rest of the// elements and find the smallest// character greater than 'first'for (int i = l + 1; i <= h; i++)if (str[i] > first && str[i] < str[ceilIndex])ceilIndex = i;return ceilIndex;}}}
Új hozzászólás Aktív témák
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Autós topik
- exHWSW - Értünk mindenhez IS
- Projektor topic
- Témázgatunk, témázgatunk!? ... avagy mutasd az Android homescreened!
- Multimédiás / PC-s hangfalszettek (2.0, 2.1, 5.1)
- BestBuy topik
- Nvidia GPU-k jövője - amit tudni vélünk
- Telekom otthoni szolgáltatások (TV, internet, telefon)
- Xiaomi smart home / Xiaomi okos otthon
- Milyen billentyűzetet vegyek?
- További aktív témák...
- Airpods Max fülpárna, gyári Apple
- Gamer PC i5 14. gen. // RTX 3080 // BOLTBÓL 27%-os SZÁMLÁVAL, GARANCIÁVAL //
- REFURBISHED - DELL Thunderbolt Dock WD19TBS (210-AZBV)
- ÁRGARANCIA!Épített KomPhone i5 12400F 16/32/64GB RAM RTX 5060 Ti 8GB GAMER PC termékbeszámítással
- ÚJ BONTATLAN Apple Macbook Air 15,3 M4 10C CPU/10C GPU/16GB/256GB - Égkék - HUN - mc7a4mg/a 3 év gar
Állásajánlatok
Cég: BroadBit Hungary Kft.
Város: Budakeszi
Cég: Laptopműhely Bt.
Város: Budapest


