Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: (Delphi ) в строке из нулей и единиц найти самую короткую  (Прочитано 9807 раз)
0 Пользователей и 1 Гость смотрят эту тему.
inmate
Гость
« : 18-05-2008 10:31 » 

Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран самую короткую группу.
« Последнее редактирование: 06-08-2008 20:08 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 18-05-2008 12:06 » 

inmate,

алгоритм вроде:

1) начинаешь просматривать строку с начала
2) запомнил, какой символ идёт - 0 или 1 , начал счётчик длины
3) когда цепочка окончилась - смотришь, меньше ли длина длины уже ранее найденной цепочки. Если это так - запоминаешь "координаты" этой цепи
4) продолжаешь глядеть строку , идём в пункт 2 , если строка не кончилась
Записан

inmate
Гость
« Ответ #2 : 18-05-2008 20:36 » 

Вот код. Но он не работает правильно.


var str:string[255];
str2:string[255];
a,b,c,i,n,min,j,k:integer;
   begin

b:=0;
a:=0;
i:=0;
min:=10;
str:=edit1.Text;
n:=Length(str);

   while i<=n do begin
   repeat
a:=a+1;
i:=i+1;
   until (str=' ') or (i>n);
   
   if (a<min) then begin
str2:='';
min:=a;
b:=i-a;
k:=i;
j:=0;
   for c:=b to i do begin
str2[j]:=str[c];
j:=j+1;
   end;
   
   end;
a:=0;
   end;
Edit2.Text:=str2;
   end;
Записан
sss
Специалист

ru
Offline Offline

« Ответ #3 : 19-05-2008 01:53 » new

Код:
var
  min, i, l: int;
          fZ: bool;
           s: string;
begin
  min = Length( s);
  l = 0;

  if ( s[0] = '0') then fZ = true else fZ = false;

  for  i := 0 to Length( s)
  begin
    if ( s[i] = '1' and fZ = true) or ( s[i] = '0' and fZ = false) then
    begin
      if ( l < min) then min = l;
      l = 0;
      fZ = not fZ;
    end;
    l = l + 1;
  end;
end.

Вдруг что-то захотелось решить простую задачу. Только я лет 8 уже не пишу в паскаль. Поэтому явные ошибки в языке придется переделать...
« Последнее редактирование: 19-05-2008 06:52 от sss » Записан

while (8==8)
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #4 : 03-06-2008 09:22 » 

Код:
...
var
  AText: string;
  i: integer;
  AMin: integer;
  AList: TStrings;
begin
  AList := TStringList.Create;
  try
    AList.Text := StringReplace (AText, ' ', #13, [rfReplaceAll]);
    AMin := 0;
    for i := 0 to AList.Count - 1 do
      if Length (AList [i]) < Length (AList [AMin]) then
        AMin := i;
  finally
    AList.Free;
  end;
  ShowMessage (AList [AMin]);
end;

код не тестил, бо дома живу под линухами, но смысл понятен, я думаю:

1. Все пробелы в строке меняем на Ентеры.
2. Засовываем всё в стринглист - имеем список всех групп.
3. Считаем самой короткой первую группу (т.е. нулевую)
4. В цикле сравниваем, если какая-то группа ещё меньше - делаем самой короткой её.
5. Выводим результат.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines