Как уже отмечалось, важно значение в конце дня в 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");
}
}