- sziku69: Fűzzük össze a szavakat :)
- Geri Bátyó: Agglegénykonyha – bevezető - igényfelmérés
- Luck Dragon: Asszociációs játék. :)
- sziku69: Szólánc.
- bambano: Bambanő háza tája
- LordAthis: AI Kérdés érkezett - 3600 soros Spagetti kód refaktorálása és budget
- Gurulunk, WAZE?!
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- GoodSpeed: AOMEI Backupper Professional Edition: Lifetime Subscription
- eBay-es kütyük kis pénzért
Ú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);
}
else
throw 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 state
if (isFinished)
return
false;
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 it
int 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 element
int 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
Hirdetés
● ha kódot szúrsz be, használd a PROGRAMKÓD formázási funkciót!
- Gumi és felni topik
- NVIDIA GeForce RTX 5080 / 5090 (GB203 / 202)
- HiFi műszaki szemmel - sztereó hangrendszerek
- eMAG vélemények - tapasztalatok
- sziku69: Fűzzük össze a szavakat :)
- Kerékpárosok, bringások ide!
- PH!otósok beszélgetős, offolós topikja
- RAID
- Amazon Fire TV stick/box
- Drum 'n' bass
- További aktív témák...
- Konica Bizhub C220 A3 fénymásoló
- HP 14 Elitebook 640 G9 FHD IPS i5-1235U 4.4Ghz 10mag 16GB 256GB Intel Iris XE Win11 Pro Garancia
- DELL Universal Dock D6000 docking station (452-BCYH) (DisplayLink)
- HIBÁTLAN iPhone 15 Pro 128GB Natural Titanium -1 ÉV GARANCIA -Kártyafüggetlen, MS3229
- LG 24GQ50F-B - 24" VA / 1920x1080 FHD / 165Hz 1ms / AMD FreeSync Premium / Adaptive Sync / HDR 10
Állásajánlatok
Cég: FOTC
Város: Budapest