На вход программе подаются строчные английские буквы. Ввод этих символов заканчивается точкой (другие символы, отличные от “.” и букв “a”..“z”, во входных данных отсутствуют; в программе на языке Бейсик символы можно вводить по одному в строке, пока не будет введена точка). Требуется написать эффективную программу, которая будет печатать буквы, встречающиеся во входной последовательности, в порядке уменьшения частоты их встречаемости. Каждая буква должна быть распечатана один раз. Точка при этом не учитывается.
Если какие-то буквы встречаются одинаковое число раз, то они выводятся в алфавитном порядке. Например, пусть на вход подаются следующие символы:
batat.
В данном случае программа должна вывести
atb
Решение:
Автор Орехова Екатерина
program n1;
uses crt;
var i,j,m:integer;
s:string;
a:array [1..26] of char;
b:array [1..26] of integer;
s1:char;
begin
for i:=1 to 26 do a[i]:=chr(i+96);
readln (s);
for i:=1 to length(s) do begin
for j:=1 to 26 do
if (s[i]=a[j]) then b[j]:=b[j]+1;
end;
for i:=1 to 25 do
for j:=1 to 25 do
if b[j] < b[j+1] then begin
m:=b[j];
s1:=a[j];
b[j]:=b[j+1];
a[j]:=a[j+1];
b[j+1]:=m;
a[j+1]:=s1;
end;
for i:=1 to 26 do
if ( b[i]<>0) then writeln (a[i],' ',b[i]);
end.
|