C/C++

Leetcode: переворот порядка слов в строке

Попробовал решить задачу "средней" сложности в хвалёном LeetCode. который айтишные гиганты, по слухам, используют для тестирования кандидатов.

Минут за 5 получился вот такой г.... хм... простенький код, в который не вложено ни капли интеллекта:
Сработало - и ладно. Но смотрим на статистику: по времени выполнения - лучше, чем у 53% участников, а по памяти - лучше, чем у 87% участников. Выборка ведь из тех решений, которые прошли тесты, уложившись в ограничения. Я ничего не
экономил, не оптимизировал, у меня должно было быть одно из худших решений. Я бы написал точно такой же код до поступления на первый курс, тут даже дискретной математики не нужно, простой здравый смысл. Что эти 87% авторов с памятью делали-то вообще?

Глядя на эти результаты, я понимаю, что мы все умрём. Эти 87% пойдут работать в ИТ-структуры, будут программировать беспилотные грузовики, медицинские системы и человекоподобных роботов-полицейских... Со временем их софт будет проектировать заводы, мосты и здания. Кто-нибудь сомневается, что нам всем - хана?
Принцип достаточности стоит выше производительности. Если конечного пользователя устраивает время работы алгоритма в одну секунду, а алгоритм справляется за одну сотою доли секунды, то проводить оптимизацию производительности не имеет смысла. Гораздо полезнее написать понятный код с использованием стандартной библиотеки. Тестируйте производительность вашей задачи...
 #include  
#include
#include
#include
using namespace std;
struct Solution {
string reverseWords(const string& s) {
deque words;
istringstream iss(s);
string word;
while (iss >> word) words.emplace_front(move(word));
stringstream ss;
for (const auto& word : words) ss word) words.push_back(word);
string result;
for (auto it = words.rbegin(); it != words.rend(); ++it) {
result += *it + " ";
}
result.pop_back();
return result;
}
};
ЕС
Енок Снхчян
71 562
Лучший ответ
Аламхонов Далер Я ж говорю, я ничего не оптимизировал. Как в детстве на всяких турбопаскалях и турбоси без коллекций писали, так и тут сделал. Тут и нечего оптимизировать, алгоритм линейный, и быстрее его никак не сделаешь. Вот медленнее - пожалуйста.

Видимо, действительно, на векторах делают и гоняют строки туда-сюда, а для разбора - стрим (только зачем? strtok проще). Я посмотрел разброс решений по памяти, всплеск - в районе 22 Мб, там явно что-то типовое, чему на каких-нибудь курсах учат.
кто то заморачивается с оптимизацией в онлайн курсе?
Serik Baldygarin
Serik Baldygarin
73 465
Аламхонов Далер Последние 3 слова - лишние, и с учётом этого - согласен.
Нужно учитывать что то что для Папы "простенький код без капли интеллекта" - сынам непостижимая наука.

Интересно а такой код какой результат получит?
 #include 
class Solution
{
void add(istringstream& in, string& st, bool& last)
{
string word;
if (in >> word) {
add(in, st, last); st += (last ? " " : "") + word; last = true;
}

}
public:
string reverseWords(string& s)
{
string st;
istringstream in(s);
bool last = false;
add(in, st, last);
return st;
}
};
Дмитрий (****)
Дмитрий (****)
51 417
Аламхонов Далер Так в чём вопрос, за регистрацию там денег не берут, а это задание - из бесплатных. Стал бы я ещё платить, чтоб их задачи решать. :-)
они идут от обратного. Кто много задаёт вопросов, тот не пройдёт
Анатолий Галай
Анатолий Галай
21 700