求一算法字符串倒置 ( 积分: 100 )

  • 主题发起人 主题发起人 hyperbrain
  • 开始时间 开始时间
H

hyperbrain

Unregistered / Unconfirmed
GUEST, unregistred user!
题目: 字符串倒置如:输入“This is a book” 输出“book a is This ”
 
题目: 字符串倒置如:输入“This is a book” 输出“book a is This ”
 
空格分割到一维数组,反转数组,合并;
 
最简单的办法:利用TStringList,
procedure TForm1.Button1Click(Sender: TObject);
var list:TStringList;
i:integer;
s:string;
begin
list:=TStringList.Create;
try
list.Sorted:=false;
list.Delimiter:=' ';//空格作为分割符
list.DelimitedText:=edit1.Text;
s:='';
for i:=list.Count-1do
wnto 0do
if trim(list.Strings)<>'' then
s:=s+' '+list.Strings;
if s<>'' then
s:=copy(s,2,length(s)-1);//去掉最前面对于的空格
edit2.Text:=s;
finally
list.Free;
end;
end;
 
function BackString(const PStr: string): string;
var
Ch: Char;
L: integer;
Sourc, Dest:PChar;
begin
L :=Length(PStr);
Sourc :=Pointer(PStr);
SetLength(Result, L);
Dest :=Pointer(Result);
while L <> 0do
begin
Ch :=Sourc^;
Inc(Sourc);
Dest[L-1] :=Ch;
Dec(L);
end;
end;
 
我的错了,是全部倒置。一楼的是对的。
 
procedure TForm1.Button1Click(Sender: TObject);
var
str: string;
lst: TStrings;
i: integer;
begin
str := 'This is a book';
lst := TStringList.Create;
while Pos(' ', str) > 0do
begin
lst.Add(Copy(str, 1, Pos(' ', str)));
Delete(str, 1, Pos(' ', str));
end;

if Length(str) > 0 then
lst.Add(str);
str := '';
for i := lst.Count - 1do
wnto 0do
begin
str := str + lst.Strings + ' ';
end;

ShowMessage(str);
lst.Free;
end;
 
先贴一个
function TForm1.daozhi(s: string):string;
var
str,tempstr:string;
i:integer;
strList:TstringList;
begin
tempstr:=s;
str:='';
strList:=TstringList.Create;
while pos(' ',tempstr)>0do
begin
strList.Add(copy(tempstr,1,pos(' ',tempstr)-1));
delete(tempstr,1,pos(' ',tempstr));
end;

strList.Add(copy(tempstr,1,length(tempstr)));
for i := strList.Count-1do
wnto 0do
begin
str:=str+' '+strList;
end;

Result:=str;
strList.Free;
end;
 
function dz(s: string):string;
var i:integer;
begin
setlength(result,length(s));
for i:=1 to length(s)do
result:=s[length(s)-i+1];
end;
 
这其实是一个字符串分割的问题,看了大家都用实现TStringList实现为什么不直接写一个算法,这样子不在DELPHI下也可以用。
 
正则表达式
 
自己写也容易:
function anastrophy(s:string):string;
var p1,p2,L:integer;
begin
result:='';
L:=length(s);
p1:=1;
while truedo
begin
while s[p1]=' 'do
begin
if p1 >=L then
exit;
p1:=p1+1;
end;
p2:=p1;
while s[p2]<>' 'do
begin
if p2=L then
begin
result:=copy(s,p1,p2-p1+1)+result;
exit;
end;
p2:=p2+1;
end;
result:=' '+copy(s,p1,p2-p1)+result;
p1:=p2;
end;
end;
 
function InvertSentence(const s:string):string;
var i,j,m,n:integer;
s1:string;
c:char;
begin
result:='';
m:=Length(s);
n:=0;
s1:='';
for i:=mdo
wnto 1do
begin
if s<>#$20 then
begin
s1:=s1+s;
inc(n);
end else
begin
for j:=1 to n div 2do
begin
c:=s1[j];
s1[j]:=s1[n-j+1];
s1[n-j+1]:=c;
end;
result:=result+s1+s;
s1:='';
n:=0;
end;
end;

for j:=1 to n div 2do
begin
c:=s1[j];
s1[j]:=s1[n-j+1];
s1[n-j+1]:=c;
end;
result:=result+s1;
end;
 
不错下次来将自己写的也贴上,就结贴。
 
function InvertString(str: string): string;
var
i :Integer;
sR :String;
ch :char;
begin
Result:='';
i:=length(str);
while i>=1do
begin
if ord(str) <=127 then
begin
sR :=sR+ str;
dec(i);
end else
begin
ch :=str;
if ((i-1)>=1) then
begin
if ord(str[i-1]) >127 then
begin
sR := sR +str[i-1] +ch;
dec(i,2);
end else
begin
sR := sR +ch;
dec(i);
end;
end else
begin
sR :=sR+ch;
inc(i);
end;
end;
end;
Result:=sR;
end;
 
哎,你门上面的好复杂啊
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
str:string;
a:string;
begin
str:='123456789';
a:='';
for i:=length(str)do
wnto 1do
begin
a:=a+copy(str,i,1);
end;
showmessage(a);
end;
 
版主得到答案,忘了结贴了!
再在这里贴代码就显得无聊了!
 
多人接受答案了。
 
后退
顶部