Przetasowanie cyfr w liczbie całkowitej

0

Przetasuj liczby z zakresu int tak jak w przykładzie.
Mając liczbę 12345, funkcja po przetasowaniu powinna zwracać 15243. Czyli algorytm tasowania polega na pobieraniu pierwszej cyfry, następnie ostatniej, później drugiej i przedostatniej itd.
Na przykład dla liczby 250 funkcja powinna zwrócić 205.

Nie zależy mi tutaj na rozwiązaniu najszybszym i najoptymalniejszym, chociaż z chęcią się z takim zapoznam. Bardziej zależy mi na rozwiązaniu najładniejszym i najczytelniejszym. Jakoś nie umiem sobie poradzić z tym zadaniem bez brzydkiego IFa gdzieś w pętli.

1

Najczytelniej byłoby chyba, Jakbys użył queue, inaczej takiej liniowej struktury, do której (i z której) można dodawać i ściągać elementy z obu końców w czasie stałym. I teraz tylko:
liczba -> tablica;
Tablicę załadować na stos i w pętli pop_first() i pop_last() do nowej tablicy i z powrotem tablica -> liczba.

0

Czekaj, zanim przejdziemy do queue i innych rozwiązań.
Masz funkcję (Java):

System.out.println(przetasowanie("12345"));

public String przetasowanie(String input) {
   for (int i=0; i<input.length()-1; i++) {
        // Tutaj dzieje się magia
   }
}

Jak to ładnie ogarnąc? Oczywiście nie musi być pętla for.

1

Napisałem w C#, ale powinieneś zrozumieć.

W pętli for wybieraj cyfry na zmianę od lewej do środka i od prawej do środka. Lewym indeksem do pobrania cyfry będzie zmienna pętli, a prawy indeks będzie obliczany. Jeśli indeksy spotkają się w środku (czyli będą równe), to nie rób nic - to będzie ostatni krok pętli w przypadku parzystej ilości cyfr.

int Shuffle(int input)
{
    string inputString = input.ToString(), outputString = "";

    for (int leftIndex = 0; leftIndex < inputString.Length / 2 + 1; leftIndex++)
    {
        outputString += inputString[leftIndex];

        int rightIndex = inputString.Length - leftIndex - 1;

        if (leftIndex != rightIndex)
        {
            outputString += inputString[rightIndex];
        }
    }

    return int.Parse(outputString);
}

Czytelniejszy, ale mniej wydajny sposób polega na przeniesieniu pierwszej cyfry z wejściowej liczby do wyniku i odwracaniu kolejności cyfr w wejściowej liczbie w każdym kroku aż do wyczerpania wszystkich cyfr:

int Shuffle(int input)
{
    IEnumerable<char> inputCollection = input.ToString().ToCharArray();
    string output = "";

    while (inputCollection.Count() > 0)
    {
        output += inputCollection.ElementAt(0);
        inputCollection = inputCollection.Skip(1).Reverse();
    }

    return int.Parse(output);
}
2

Ja bym to zrobił tak, z ifem poza pętlą:

        static int Shuffle(int number)
        {
            char[] input = number.ToString().ToCharArray();
            List<Char> output = new List<char>();
         
            int left = 0;
            int right = input.Length - 1;
            while (left < right)
            {
                output.Add(input[left++]);
                output.Add(input[right--]);
            }

            if (left == right)
                output.Add(input[left]);

            return int.Parse(new String(output.ToArray()));
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1