Nicht "oder so", sondern nur so wie Profi
.
Es gibt allerdings einen Unterschied: #37 liefert wie in #26 verlangt den String, #38 die Position.
Zeitlich bewegen wir uns im gleichen Rahmen. Profi nutzt aus, dass Strings Null-terminiert sind, muss aber die =#0 Abfrage bei jedem Zeichen ausführen, #37 "einmal" am Schluss *.
Hallo Michael,
Zu "#37 liefert wie in #26 verlangt den String, #38 die Position"
Nee, #28 liefert die Länge der Ziffernfolge
Um die Ziffernfolge selbst zu liefern, bedarf es einiger kleiner Änderungen.
Hier die Funktion, die die Ziffernfolge liefert
Delphi-Quellcode:
FUNCTION LongestCipherSequence(const S:String):String;
var MaxLen:Integer; P,PS,PSMax,PStart:PChar;
begin
MaxLen:=0;
PStart:=PChar(S);
P:=PStart;
if P<>Nil then
repeat
case P^ of
#0 : Break;
'0'..'9' : begin
PS:=P;
Inc(P);
while P^ in ['0'..'9'] do Inc(P);
if P-PS>MaxLen then begin
MaxLen:=P-PS;
PSMax:=PS;
end;
end;
else Inc(P);
end;
until False;
if MaxLen=0 then Result:=''
else Result:=Copy(S,PSMax-PStart+1,MaxLen);
end;
Zu "muss aber die =#0 Abfrage bei jedem Zeichen ausführen, #37 "einmal" am Schluss"
Nee, stimmt nicht.
Beim While wird ebenfalls bei jedem Zeichen geprüft, ob I >= len_s ist.
Vom Zeitaufwand her macht das keinen Unterschied.
Ich habe mal kurz das Zeitverhalten getestet. Gleiche Größenordung bei beiden Funktionen.
Ergebnis siehe Anhang:
Man könnte das Zeitverhalten noch optimieren:
Wenn bereits eine Ziffernfolge gefunden wurde, kann man beim Finden der nächsten Ziffer prüfen, ob das Zeichen an P+Maxlen eine Ziffer ist.
Wenn nicht, kann die Ziffernfolge nicht länger sein, als die bisher längste.
Dann kann man P = P+MaxLen setzen, muss also nicht jedes Zeichen separat prüfen.
Das lohnt sich aber nur, wenn wirklich lange Strings mit vielen Ziffern geprüft werden sollen, ansonsten wird das eher zu einem höheren Zeitbedarf führen.
Delphi-Quellcode:
PROCEDURE TMain.Test;
const Lines=10000; MaxLen=200; Rnd=12; Count=1000;
var I,J,Len:Integer; T0,T1,T2:Cardinal; S:String; List:TStrings;
begin
List:=TStringList.Create;
for I:=1 to Lines do begin
Len:=Random(MaxLen);
SetLength(S,Len);
for J:=1 to Len do
S[J]:=Char(Random(Rnd)+Ord('0'));
List.Add(S)
end;
T0:=GetTickCount;
for I:=1 to Count do
for J:=0 to List.Count-1 do
LongestCipherSequence(List[J]);
T1:=GetTickCount;
for I:=1 to Count do
for J:=0 to List.Count-1 do
LaengsteZiffernFolgeDerWelt(List[J]);
T2:=GetTickCount;
ShowMessage(IntToStr(T1-T0)+' LongestCipherSequence'#13+
IntToStr(T2-T1)+' LaengsteZiffernFolgeDerWelt');
List.Free;
end;