Ich muss ein Programm schreiben, das zählt, wie viele verschiedene Buchstaben in der Zeichenfolge sind. Zum Beispiel wird "abc" 3 geben; und "abcabc" wird auch 3 geben, weil es nur 3 verschiedene Buchstaben gibt.
Ich muss Pascal verwenden, aber wenn Sie mit Code in verschiedenen Sprachen helfen können, wäre es auch sehr nett.
Hier ist mein Code, der nicht funktioniert:
%Vor%x ist der andere Buchstabenzähler; Vielleicht ist mein Algorithmus sehr schlecht .. irgendwelche Ideen? Danke.
Sie haben Antworten darauf, wie es geht, hier ist, warum Ihr Weg nicht funktioniert.
Zuerst hatten Sie intuitiv eine gute Idee: Beginnen Sie mit dem ersten Zeichen in der Zeichenfolge, zählen Sie es (Sie haben vergessen, den Zählcode einzuschließen), entfernen Sie alle Vorkommen desselben Zeichens in der Zeichenfolge. Die Idee ist ineffizient, aber es würde funktionieren. Sie haben mit diesem Codebeispiel Probleme bekommen:
%Vor% Das Problem ist, Pascal wird den Wert Length(s)
beim Einrichten der Schleife übernehmen, aber Ihr Code ändert die Länge der Zeichenfolge, indem er Zeichen entfernt (mit delete(s,i,1)
). Sie werden am Ende schlechtes Gedächtnis sehen. Das zweite Problem ist, dass i
vorankommt, es spielt keine Rolle, ob es einem Char entspricht oder nicht. Hier ist, warum das schlecht ist.
Du wirst nach i = 1,2,3,4,5 suchen und nach a
suchen. Wenn i
1 ist, findest du eine Übereinstimmung, entferne das erste Zeichen und deine Zeichenfolge wird wie folgt aussehen:
Sie testen jetzt mit i = 2, und es ist keine Übereinstimmung, weil s [2] = b. Sie haben nur einen a
abgefahren, und dieser gegebene a
bleibt in dem Array eine andere Runde und veranlaßt Ihren Algorithmus, ihn zweimal zu zählen. Der "feste" Algorithmus würde so aussehen:
Das ist anders: Im Beispiel, wenn ich eine Übereinstimmung bei 1
gefunden habe, geht der Cursor nicht weiter, also sieht er das zweite a
. Auch weil ich eine while
-Schleife, nicht eine for
-Schleife verwende, kann ich keine Probleme mit möglichen Implementierungsdetails der for-Schleife bekommen.
Ihr Algorithmus hat ein anderes Problem. Nach der Schleife, die alle Vorkommen des ersten Zeichens in Zeichenfolge entfernt, bereiten Sie die nächste Schleife mit diesem Code vor:
c: = s [1];
Das Problem ist, wenn Sie diesem Algorithmus eine Zeichenkette der Form aa
(Länge = 2, zwei identische Zeichen) zuführen, wird die Schleife, das Löschen oder das Auftreten von a
(diejenigen, die s zu einem machen EMPTY string) und dann versuchen, das erste Zeichen der LEEREN Zeichenfolge zu lesen.
Ein letztes Wort: Ihr Algorithmus sollte die leere Zeichenkette bei der Eingabe verarbeiten und einen count = 0 zurückgeben. Hier ist der feste Algorithmus:
%Vor%Ich bin ein Delphi-Experte, also weiß ich nicht genau, wie restriktiv Pascal ist. Trotzdem ist das Delphi:
%Vor%Die erste Zeile kann geschrieben werden
%Vor%, wenn Sie die Windows-API (oder die Funktion Delphi FillChar
) nicht verwenden können.
Wenn Sie Unicode-Unterstützung (wie in Delphi 2009+) haben möchten, können Sie dies tun
%Vor%Hier ist meine Version. Ich sage nicht, dass Sie eine gute Note in Ihrer Aufgabe bekommen werden, wenn Sie das einreichen.
%Vor%Eine Delphi-Version. Gleiche Idee wie @ Die kommunistische Ente Python-Version.
%Vor%Und mit einem Delphi-Konstrukt (nicht effizient, aber sauber)
%Vor%In Python, mit Erklärung, wenn Sie es für eine andere Sprache wollen: (Da Sie verschiedene Sprachen wollten)
%Vor%