Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2011, 16:28   #1
MrGukk
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 33
По умолчанию Задача с собеседования

Добрый день!

Был сегодня на собеседовании и в качестве задачи было предложено написать следующую программу.

Написать функию, которая принимает на вход строку как аргумент (напр. 1b32apo94), ничего не возвращает, а строку меняет т.о. чтобы сначала стояли буквы, а потом цифры, при этом порядок в котором буквы и цифры встречаются в строке не менять. Для данного примера, правильно работающая программа должна получить:
bapo13294.

Конечно, можно выделить память и за 2 цикла решить задачу, но криво как-то.

Можно ли сделать соответствующие преобразования без выделения памяти?
Хоть примерный алгоритм.

Заранее спасибо.
MrGukk вне форума Ответить с цитированием
Старый 22.08.2011, 16:34   #2
MrGukk
Пользователь
 
Регистрация: 09.05.2011
Сообщений: 33
По умолчанию

ЗЫ. Язык С++.
MrGukk вне форума Ответить с цитированием
Старый 22.08.2011, 16:56   #3
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Код:
procedure transNum(var s:string);
var
t,t2:string; i:integer;
const num = ['0'..'9'];
begin
  t:=''; t2:='';
  for i :=1 to length(s) do
    if s[i] in num then
      t:=t+s[i]
    else
      t2:=t2+s[i];
  s:=t2+t;
end;
еще можно через сравнение

Код:
procedure transNum(var s:string);
var t,t2:string; i:integer;
begin
  t:=''; t2:='';
  for i :=1 to length(s) do
    if (s[i] >= '0') and (s[i] <= '9') then
      t:=t+s[i]
    else
      t2:=t2+s[i];
  s:=t2+t;
end;
незнаю как C++ а на delphi так

Последний раз редактировалось Lesha; 22.08.2011 в 17:01.
Lesha вне форума Ответить с цитированием
Старый 22.08.2011, 17:02   #4
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
а на delphi так
И на delphi не так. Совсем не так.
то что ты привел не имеет к "без выделения памяти" ни малейшего отношения.
mss вне форума Ответить с цитированием
Старый 22.08.2011, 17:23   #5
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

ну тогда вот еще
издержки вычислений = 8 байт

Код:
procedure transNum(var s:string);
var i,l:integer;
begin
  l:=length(s); i:=1;
  while i<=l do begin
    if (s[i] >= '0') and (s[i] <= '9') then begin
     s:=s+s[i];
     delete(s,i,1);
     l:=l-1;
    end else
     i:=i+1;
  end;
end;
Lesha вне форума Ответить с цитированием
Старый 22.08.2011, 17:26   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
ну тогда вот еще
Те же фаберже, только вид сбоку - вновь в коде фигурирует выделение/перераспределение памяти.
mss вне форума Ответить с цитированием
Старый 22.08.2011, 17:44   #7
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Код:
procedure transNum(var s: ShortString);
begin
  s:=char(length(s)+2)+char(3)+s;
  while s[2]<=s[1] do begin
    if (s[byte(s[2])] >= '0') and (s[byte(s[2])] <= '9') then begin
     s:=s+s[byte(s[2])];
     delete(s,byte(s[2]),1);
     s[1]:=char(byte(s[1])-1);
    end else
     s[2]:=char(byte(s[2])+1);
  end;
    delete(s,1,2);
end;
все вычисления строго в строке никаких переменных
Lesha вне форума Ответить с цитированием
Старый 22.08.2011, 17:44   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я бы такое предложил:
Код:
var s:string;k,i:integer; c:char;
begin
 s:='1b32apo94';
 for i:=1 to length(s) do for k:=i+1 to  length(s) do begin
  if  (s[i] in ['0'..'9']) then begin
   c:=s[k];s[k]:=s[i];s[i]:=c;
  end;
 end;
 write(s);readln;
  { TODO -oUser -cConsole Main : Insert code here }
end.
Цитата:
все вычисления строго в строке никаких переменных
Если не ошибаюсь delete(s,byte(s[2]),1); и s:=s+s[byte(s[2])]; заставляют срабатывать механизмы перераспределения памяти - создается новая строка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.08.2011, 17:53   #9
Lesha
Форумчанин
 
Аватар для Lesha
 
Регистрация: 30.01.2009
Сообщений: 418
По умолчанию

Цитата:
срабатывать механизмы перераспределения памяти - создается новая строка
взять ваш код и мой, с вычислениями внутри строки, соединить их и получится без выделения "лишней" памяти
Lesha вне форума Ответить с цитированием
Старый 22.08.2011, 18:53   #10
onewho
Форумчанин
 
Регистрация: 29.09.2010
Сообщений: 636
По умолчанию

автор имеет ввиду, без вставок, только обменами, перемешать последовательность. я так понимаю максимум одна временная переменная.

однако неизвестно что будет эффективней.

и стоило бы указать работаем то со string или char[] ?

ПС: в С++ любое такое действо делается 1ой функцией stable_partition
http://www.cplusplus.com/reference/a...ble_partition/
хотя разумеется ясно что задача дана на алгоритм.

удачи !
onewho вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача минимизации дисбаланса на линии сборки (задача минимакса) LenZab Microsoft Office Excel 13 13.03.2011 22:51
задача ksk Microsoft Office Excel 2 17.02.2011 23:08
Задача Dog Помощь студентам 3 20.09.2009 18:09