16,742
社区成员
发帖
与我相关
我的任务
分享function TForm1.OrderByMultiRules(s: string): string;
var
i, k, m, tsCount: Integer;
ts: TStringList;
tmp: string;
begin
ts := TStringList.Create;
try
k := 0;
//先分割成数据字 如 53215151010101 先分割成 5 3 2 15 15 10 10 10 1,共9份。
ts.Add(s[1]);
for i := 2 to Length(s) do
begin
if StrToInt(ts[k] + s[i]) <= 15 then //如果当前值加前一值 小于15,则合成一份
ts[k] := ts[k] + s[i]
else //否则新增一份
begin
ts.Add(s[i]);
Inc(k);//记 ts 中元素个数
end;
end;
//再把临近相等的值合并成一份,以便用于后面的比较,合并后变成(5 3 2 1515 101010 1),共6份
tsCount := ts.Count - 1;
for i := tsCount downto 1 do
begin
if ts[Pred(i)] = tmp then //如果和前面的一个相等,则合并
begin
ts[i] := ts[i] + ts[Pred(i)];
ts.Delete(Pred(i)); //合并删除被合并的单元
end
else
tmp := ts[Pred(i)];//记录相等的值
end;
//改进后的冒泡排序
m := ts.Count - 1;
while m > 0 do
begin
k := 0;
for i := 0 to m - 1 do
if StrToInt(ts[i]) < StrToInt(ts[Succ(i)]) then
begin
tmp := ts[i];
ts[i] := ts[Succ(i)];
ts[Succ(i)] := tmp;
k := i; //记录本次换位发生的位置
end;
m := k; //本循环后发生交换的位置
end;
//输出
for i := 0 to ts.Count - 1 do
Result := Result + ts[i];
finally
FreeAndNil(ts);
end;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
//ShowMessage(OrderByMultiRules('99858885599913'));
ShowMessage(OrderByMultiRules('53215151010101'));
end;