Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
13-1124902059
jenbond
2005-08-24 20:47
2010.03.21
Мысли по вопросу о создании web приложения


2-1264116575
pazitiff
2010-01-22 02:29
2010.03.21
Invalid pointer operation


2-1263756018
Jimmy
2010-01-17 22:20
2010.03.21
Замена цветов


2-1263488516
HRustBB
2010-01-14 20:01
2010.03.21
как вызвать процедуру по ссылке?


2-1263635338
OOO_leg
2010-01-16 12:48
2010.03.21
Компоненты





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский