#c #algorithm
#c #алгоритм
Вопрос:
Я делаю упражнение для развлечения (не домашнее задание), где задана последовательность отсортированных строк с одним словом, которое появляется слишком рано, мы должны распечатать отсортированную последовательность. Дело в том, что мы должны сделать это с O (1) вспомогательным пробелом, поэтому нет vector
ни list
Я попробовал следующее:
#include <iostream>
#include <string>
using namespace std;
int main() {
string current, next, mal;
bool trobat = false;
cin >> current >> next;
while (next != "END") {
if (trobat) {
if (mal > current and mal < next) {
cout << current << endl;
cout << mal << endl;
trobat = false;
}
else {
cout << current << endl;
}
}
else if (current < next) {
cout << current << endl;
}
else {
trobat = true;
mal = current;
cout << next << endl;
}
current = next;
cin >> next;
}
if (trobat) {
cout << mal << endl;
}
else {
cout << current << endl;
}
}
По сути, я пытаюсь получить 3 строки: одну с текущим значением, подлежащим обработке, одну со следующей и одну с неправильно размещенным словом, called mal
.
trobat
указывает, найдено ли слово not sorted, но еще не напечатано.
Если слово помещено правильно, мы печатаем его с else if (current < next)
помощью . Если нет, я активирую флаг trobat и печатаю следующее значение, потому что следующее должно быть отсортировано. Затем, для первого if, если я нашел значение, я проверяю, находится ли mal
оно в правильном положении, в противном случае я печатаю текущее и повторяю процесс.
У меня возникли проблемы со следующими тестами:
INP1:
a
b
e
c
d
f
g
END
OUT1:
a
b
c
c
d
e
f
g
ожидаемый ВЫХОД1:
a
b
c
d
e
f
g
INP2:
f
aaaaaa
bbbbb
cccc
ddd
ee
END
OUT2:
aaaaaa
aaaaaa
bbbbb
cccc
ddd
f
ожидаемый ВЫХОД2:
aaaaaa
bbbbb
cccc
ddd
ee
f
Комментарии:
1. Обратите внимание, что вы добавляете все свои входные строки в
s
. Это определенно неO(1)
пробел, и в этот момент вы могли бы также использовать вектор. Кроме того, вам нужно показать выходные данные вашей программы.2. @cigien написал в OP, что я использую s только для целей отладки. Я собираюсь отредактировать выходные данные.
3. О, это правда. Да, отредактируйте полученный результат.
4. @cigien Я добавил значение
s
, потому что терминал одновременно отображает входные и выходные данные, и все в беспорядке… Надеюсь, это имеет смысл.5. «терминал одновременно отображает входные и выходные данные» . Вы можете создать файл со всеми входными данными, а затем выполнить
cat input.txt | my_app.exe
. это не привело бы к смешиванию ввода / вывода. (но больше не будет интерактивным).
Ответ №1:
Вы можете упростить код до:
std::string word1;
std::string word2;
std::cin >> word1 >> word2;
while (word2 != "END") {
std::cout << std::min(word1, word2) << std::endl;
word1 = std::max(word1, word2);
std::cin >> word2;
}
std::cout << word1 << std::endl;
Комментарии:
1. Прекрасно сделано! Я не думал об этом… Намного элегантнее, чем куча if