Форум: "Начинающим";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
ВнизСколько различных символов содержит строка. Найти похожие ветки
← →
Б (2010-01-19 21:11) [0]Здрасти!
Остановился тут на 1-й задачке:
Определелить сколько различных символов содержит строка.
← →
Anatoly Podgoretsky © (2010-01-19 21:21) [1]> Б (19.01.2010 21:11:00) [0]
Это считать надо.
← →
Б (2010-01-19 21:27) [2]
> Это считать надо.
Дак, понятно. Как?
← →
Andy BitOff © (2010-01-19 21:39) [3]Перебором. Как же еще.
← →
sniknik © (2010-01-19 21:57) [4]а можно отсортировать символы в строке, а после линейный подсчет - берем первый символ, "бежим" и считаем до первого не совпадающего. далее меняем символ на него и повторяем и так пока строка не "кончится".
← →
Сергей М. © (2010-01-19 21:57) [5]
> Как?
Это сортировать надо
← →
Anatoly Podgoretsky © (2010-01-19 22:06) [6]> Б (19.01.2010 21:27:02) [2]
Количество обычно считается простым сумированием
if then x := X +1
← →
Джо © (2010-01-19 22:13) [7]Не думая о вопросах производительности, можно сделать так:
1. Заводим (динамический) массив для хранения информации об использованных символах:type
// Информация о конкретной букве
TLetter = record
Value: Char;
Count: Integer;
end;
TLetters = array of TLetter;
var
Letters: TLetters;
2. Проходим по каждому символу строки:for I := 1 to Length(S) do
3. Каждый следующий символ S[I] ищем в массиве Letters, если он не найден, добавляем его в массив и счетчик ставим в 1, если найден, то просто увеличиваем счетчик.
Конкретные вопросы по реализации будут — велкам.
← →
antonn © (2010-01-19 22:26) [8]или завести статический массив array[0..256-1] of boolean;, в цикле пробегать по сроке и ставить true в массиве по индексу ord(). После пробега посчитать все true в массиве. Вариант для однобайтовых кодировок :)
← →
Демо © (2010-01-19 22:30) [9]
var
Chars: array[0..255] of Integer;
i: Integer;
begin
ZeroMemory(@Chars[0],1024);
for i := 1 to Length(SrcStr) do Chars[Ord(SrcStr[i])] := Chars[Ord(SrcStr[i])]+1;
← →
turbouser © (2010-01-19 22:36) [10]
> antonn © (19.01.10 22:26) [8]
>
> или завести статический массив array[0..256-1]
unicode?
← →
turbouser © (2010-01-19 22:37) [11]
> antonn © (19.01.10 22:26) [8]
> Вариант для однобайтовых кодировок :)
Аа :) Сорри :)
← →
sniknik © (2010-01-19 23:00) [12]> Не думая о вопросах производительности
берем первый символ, бежим по строке до конца считаем совпадения с ним, выводим посчитанное, символ - количество. делаем стрингреплесе этого символа на пустую строку (т.е. исключаем его из строки), и повторяем операцию заново до тех пор пока вся строка не "опустеет".
← →
oxffff © (2010-01-19 23:52) [13]Case insensitivity?
P.S
ответ 6.
← →
Sha © (2010-01-20 00:09) [14]> Б (19.01.10 21:11)
Есть еще вариант со множеством, аналогичный [8].
Реализуй сам.
← →
{RASkov} © (2010-01-20 00:25) [15]
function CountUnicChInStr(const S: String): Integer;
var N: Integer;
begin
with TStringList.Create do try
Duplicates:=dupIgnore;
Sorted:=True;
for N:= 1 to Length(S) do Add(S[N]);
Result:=Count;
finally
Free;
end;
end;
← →
Юрий Зотов © (2010-01-20 00:54) [16]var
Arr: array[char] of integer;
for i := 1 to Length[S] do
Inc(Arr[S[i]]);
← →
Anatoly Podgoretsky © (2010-01-20 01:03) [17]> turbouser (19.01.2010 22:36:10) [10]
Да хоть Юникод, просто размер будет побольше, 64к элементов байт/Integer
← →
Германн © (2010-01-20 01:16) [18]
> Юрий Зотов © (20.01.10 00:54) [16]
Самое элегантное решение.
В духе Борланда однопроходное! :)
В духе Дельфи тем, что массив должен быть полем ("Поллем. Как слышишь? Приём.") И использоваться только однократно при запуске приложения. :)
В духе БорландПаскаль тем, что использует Inc вместо +1. (Кстати. Дельфийский хелп всё ещё советует использовать Inc вместо +1 ввиду "повышенной скорости"? Кто имеет последние версии Дельфи).
← →
antonn © (2010-01-20 01:50) [19]повышенная скорость в отладчике не сильно заметна, т.к. он все равно +1 заменяет на inc()
← →
Германн © (2010-01-20 01:54) [20]
> antonn © (20.01.10 01:50) [19]
>
> повышенная скорость в отладчике не сильно заметна, т.к.
> он все равно +1 заменяет на inc()
>
Он - это отладчик? А это как собственно?
← →
antonn © (2010-01-20 02:09) [21]Он - дельфи :)
http://antonn.com/xlam/delp_inc.JPG
← →
Германн © (2010-01-20 02:19) [22]
> antonn © (20.01.10 02:09) [21]
>
> Он - дельфи :)
>
Ну тогда так и говори. Он - оптимизатор дельфи компилятора.
Но ты вообще не в теме [18].
← →
Sha © (2010-01-20 10:46) [23]> Самое элегантное решение.
Интересно, есть ли минусы у этого решения? :)
> использовать Inc вместо +1 ввиду "повышенной скорости"?
> он все равно +1 заменяет на inc()
И правильно делает, на современных процессорах машинная Inc может только уменьшить скорость
← →
Б (2010-01-20 11:35) [24]Всем спасибо, выручили.
Воспользовался antonn"овским методом. ;)
← →
Anatoly Podgoretsky © (2010-01-20 11:46) [25]> Юрий Зотов (20.01.2010 00:54:16) [16]
и плюс второй цикл
N :=0;
for I := Low(arr) to High(Arr) do
if Arr[i]> 0 then N := N +1;
← →
Anatoly Podgoretsky © (2010-01-20 11:50) [26]> Германн (20.01.2010 01:16:18) [18]
На некоторых процессорах ADD M, 1 выполняется быстрее INC M.
А еще увеличение может быть на больший размер.
Я бы не старался угадать, что будет быстрее и использовал бы всегда M + N
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.03.21;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.004 c