Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.03.21;
Скачать: CL | DM;

Вниз

Сколько различных символов содержит строка.   Найти похожие ветки 

 
Б   (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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.011 c
2-1263542459
Andy BitOff
2010-01-15 11:00
2010.03.21
Нумерация страниц в Ворде


1-1242738691
Franzy
2009-05-19 17:11
2010.03.21
Некорректное отображение программ Дельфи на некоторых компах


4-1228124695
markers
2008-12-01 12:44
2010.03.21
System Error 5


2-1263838589
mpdasa
2010-01-18 21:16
2010.03.21
как написать: если A>2 и А<5 тогда


15-1262571775
uw
2010-01-04 05:22
2010.03.21
Что и требовалось доказать