Как уже отмечалось, важно значение в конце дня в r. не стесняйтесь изменять тесты, пока фактические значения остаются прежними.

но я участвовал в техническом интервью на C ++, где мне дали немного простого кода для работы со строками, который предназначен для того, чтобы взять строку и вернуть строку, состоящую из первого и последнего n-символов, а затем приступить к исправлению любого Ошибки, а также чтобы сделать функцию максимально эффективной, я предложил следующее решение, однако интервьюер заявил, что существует еще более быстрый и оптимальный способ:

Оригинальный код:

std::string first_last_n(int n, std::string s)
{
   std::string first_n = s.substr(0,n);
   std::string last_n = s.substr(s.size()-n-1,n);
   return first_n + last_n;
}

Мой код:

bool first_last_n(const std::size_t& n, const std::string& s, std::string& r)
{
   if (s.size() < n)
      return false;
   r.reserve(2 * n);
   r.resize(0);
   r.append(s.data(),s.data() + n);
   r.append(s.data() + (s.size() - n), s.data() + s.size());
   return true;
}

Резюме моих изменений:

Изменен интерфейс для получения возвращаемой строки в качестве ссылки (при условии, что RVO и значения r еще не доступны)

Удалены временные строки, создаваемые через substr

Передала входную строку в качестве константного ссылочного порядка, чтобы обойти временную реализацию ввода

Исправлена ​​ошибка off-by-1 в строке last_n

Уменьшено количество раз, когда каждый персонаж приземляется до одного или двух раз (в случае перекрывающегося сценария)

Размещается проверка в случае, если размер строки s меньше n, возвращая false для сбоя.

Предполагая, что разрешен только нативный C ++, есть ли какой-то другой способ сделать это более эффективно или оптимально?

Примечание 1: Исходный экземпляр входной строки не должен изменяться.

Заметка 2: Все решения должны пройти следующий контрольный пример, в противном случае они недействительны.

void test()
{
   {
      std::string s = "0123456789";
      std::string r = first_last_n(10,s);
      assert(r == "01234567890123456789");
   }

   {
      std::string s = "0123456789ABC0123456789";
      std::string r = first_last_n(10,s);
      assert(r == "01234567890123456789");
   }

   {
      std::string s = "1234321";
      std::string r = first_last_n(5,s);
      assert(r == "1234334321");
   }

}

Ответы на вопрос(0)

Ваш ответ на вопрос