Heim  >  Artikel  >  Backend-Entwicklung  >  Die glückliche Sorte

Die glückliche Sorte

王林
王林Original
2024-09-03 15:08:151023Durchsuche

The lucky sort

Wöchentliche Herausforderung 284

Jede Woche verschickt Mohammad S. Anwar die Weekly Challenge, eine Chance für uns alle, Lösungen für zwei wöchentliche Aufgaben zu finden. Meine Lösungen werden zunächst in Python geschrieben und dann in Perl konvertiert. Es ist eine großartige Möglichkeit für uns alle, etwas Codierung zu üben.

Herausforderung, meine Lösungen

Aufgabe 1: Lucky Integer

Aufgabe

Sie erhalten ein Array von Ganzzahlen, @ints.

Schreiben Sie ein Skript, um die glückliche Ganzzahl zu finden, falls sie gefunden wird, andernfalls geben Sie -1 zurück. Wenn es mehr als eine gibt, geben Sie die größte zurück.

Eine glückliche Ganzzahl ist eine Ganzzahl, deren Häufigkeit im Array ihrem Wert entspricht.

Meine Lösung

Diese Aufgabe ist relativ einfach und erfordert daher nicht viel Erklärung. Ich erstelle ein Diktat (Hash in Perl) der Häufigkeit jeder Ganzzahl, genannt freq. Dann iteriere ich durch die Tasten von freq (höchster Wert zuerst). Wenn die Häufigkeit der Ganzzahl mit dem Wert übereinstimmt, gebe ich diese Zahl zurück. Wenn der Iterator erschöpft ist, gebe ich -1 zurück.

def lucky_integer(ints: list) -> str:
    freq = Counter(ints)

    for i in sorted(freq, reverse=True):
        if i == freq[i]:
            return i

    return -1

Beispiele

$ ./ch-1.py 2 2 3 4
2

$ ./ch-1.py 1 2 2 3 3 3
3

$ ./ch-1.py 1 1 1 3
-1

Aufgabe 2: Relative Sortierung

Aufgabe

Sie erhalten zwei Listen mit ganzen Zahlen, @list1 und @list2. Die Elemente in @list2 sind unterschiedlich und auch in @list1.

Schreiben Sie ein Skript, um die Elemente in @list1 so zu sortieren, dass die relative Reihenfolge der Elemente in @list1 mit der in @list2 übereinstimmt. Elemente, die in @list2 fehlen, sollten in aufsteigender Reihenfolge am Ende von @list1 platziert werden.

Meine Lösung

Während Python über die Indexfunktion für Listen verfügt, löst es eine ValueError-Ausnahme aus, wenn das Element nicht in der Liste enthalten ist. Deshalb habe ich eine Funktion namens find_index erstellt, die die Position von val in lst zurückgibt, wenn sie gefunden wird, oder die Länge der Liste zurückgibt, wenn nicht.

def find_index(lst: list, val: int):
    return lst.index(val) if val in lst else len(lst)

Die Perl-Lösung hat auch die gleiche Funktion und verwendet den first_index von List::MoreUtil, um die Position zu finden.

sub find_index( $lst, $val ) {
    my $idx = first_index { $_ == $val } @$lst;
    return $idx == -1 ? scalar(@$lst) : $idx;
}

Ich verwende die Sortierfunktion, um die erste Liste zu sortieren. Jedes Element wird nach einem Tupel aus der Indexposition und der Ganzzahl sortiert. Dadurch wird sichergestellt, dass der erste Teil der resultierenden Liste entsprechend der Position in der zweiten Liste sortiert wird, während die übrigen Werte numerisch sortiert werden.

def relative_sort(list1: list, list2: list) -> list:
    return sorted(list1, key=lambda i: (find_index(list2, i), i))

Die Perl-Lösung verwendet dieselbe Logik, aber eine völlig andere Syntax.

sub main ($lists) {
    my $list1 = $lists->[0];
    my $list2 = $lists->[1];

    my @solution = sort {
        find_index( $list2, $a ) <=> find_index( $list2, $b )
          or $a <=> $b
    } @$list1;
    say '(', join( ', ', @solution ), ')';
}

Für die Eingabe über die Befehlszeile nehme ich einen JSON-String, der eine Liste mit ganzen Zahlen sein sollte.

Beispiele

$ ./ch-2.py "[[2, 3, 9, 3, 1, 4, 6, 7, 2, 8, 5],[2, 1, 4, 3, 5, 6]]"
(2, 2, 1, 4, 3, 3, 5, 6, 7, 8, 9)

$ ./ch-2.py "[[3, 3, 4, 6, 2, 4, 2, 1, 3],[1, 3, 2]]"
(1, 3, 3, 3, 2, 2, 4, 4, 6)

$ ./ch-2.py "[[3, 0, 5, 0, 2, 1, 4, 1, 1],[1, 0, 3, 2]]"
(1, 1, 1, 0, 0, 3, 2, 4, 5)

Das obige ist der detaillierte Inhalt vonDie glückliche Sorte. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:Einführung in Python :)Nächster Artikel:Einführung in Python :)