Маскирование пробелов в строке

Опубликовано Sep 30, 2011 в Массивы и строки | 3 коммент.


Реализуйте метод замены всех пробелов в строке s на подстроку“%20”.

char* replace_spaces(const char *s)
{
  //ваш код
}
1 Цель задания быстрая проверка простых навыков алгоритмического мышления и работы со строками в стиле С
2 Время выполнения 15 минут
3 Формат выполнения код пишется на компьютере/бумаге по желанию, без доступа к документации

Критерии оценки FulcrumWeb:

Кандидат должен продемонстрировать умение реализовывать элементарные алгоритмы и знания, как работать с C-строками.

Ожидаемые вопросы:

  1. Есть ли специальные требования к способу выделения памяти для новой строки? Годится ли аналогия с функциональностью стандартной char *strdup(const char *s)?
  2. Критично ли быстродействие?
  3. Планируется ли использование этой функции как библиотечной?
  4. В какой кодировке может быть задана исходная строка?

Оценка результатов:

Для начинающего программиста полное отсутствие вопросов простительно. Принимается любое работоспособное решение для ANSI строк. Очень хорошо, если будет озвучено, как должно происходить выделение и освобождение памяти под результирующую строку, иначе эти вопросы будут подняты.

От программиста с опытом работы мы ожидаем услышать вопросы, которые покажут понимание того, откуда у данной задачи “растут ноги”, в первую очередь – это маскирование поисковых URL. Реализация критичного к быстродействию решения для различных кодировок по сложности выходит за рамки офисного собеседования, но понимание подходов к нему можно продемонстрировать.


3 Коммент. : “Маскирование пробелов в строке”

  1. Написал возможный вариант решения и выложил сюда:

    // Implement the method of replacing all the spaces in the string with substring "%20"
    char* replace_spaces(const char *s)
    {
            const char SPACE = ' ';
            const char REPLACEMENT[] = "%20";
            unsigned int numOfSpaces = 0;
            for(int i = 0; i < strlen(s); i++)
            {
                    if(s[i] == SPACE)
                    {
                            numOfSpaces++;
                    }
            }
            // we have found number of spaces in the string
            // it helps us to define the exact size of modified string
            char* modifiedString = new char[strlen(s) - numOfSpaces + numOfSpaces*strlen(REPLACEMENT) + 1];
            modifiedString[strlen(s) - numOfSpaces + numOfSpaces*strlen(REPLACEMENT)] = '\0';
            for(int sourceStrIdx = 0, modifiedStrIdx = 0; sourceStrIdx < strlen(s); sourceStrIdx++)
            {
                    if(s[sourceStrIdx] != SPACE)
                    {
                            modifiedString[modifiedStrIdx] = s[sourceStrIdx];
                            modifiedStrIdx++;
                    }
                    else
                    {
                            for(int k = 0; k < strlen(REPLACEMENT); k++)
                            {
                                    modifiedString[modifiedStrIdx] = REPLACEMENT[k];
                                    modifiedStrIdx++;
                            }
                    }
            }
            return modifiedString;
    }

    Не совсем понятно, как в комментарии вставить форматированный код с подсветкой синтаксиса.

    • Галина says:

      Нужно код заключить в теги
      Теги для выделения кода

      Для первого варианта – нужно самостоятельно следить за шириной.

    • Или так:

      char* replace_spaces(const char *s)
      {
      int src_len =0,
      numOfSpc=0;
      char* ret;
      const char* s_tmp=s;

      while(*s)
      {
      if(*s==' ')++numOfSpc;
      ++src_len;
      *s++;
      }
      s=s_tmp;

      ret=new char[src_len+numOfSpc*3+1];
      char* ret_tmp=ret;
      while(*s)
      {
      if(*s==' ')
      {
      *ret++='%';
      *ret++='2';
      *ret ='0';
      }
      else *ret=*s;
      *ret++;
      *s++;
      }
      *ret=0;

      return ret_tmp;
      }

Оставить комментарий

Ваш адрес email не будет опубликован.


*