Печать последовательности строк с одной пропущенной строкой

#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