Задача: В заданной строке вставить перед каждым символом «-» символ «+».
Решение: В цикле просматриваем строку x, если находим символ «-», то увеличиваем счетчик. Создаем строку длинной старой строки плюс счетчик. Во втором цикле, если символ не равен «-», то записываем его в новую строку, иначе вставляем «+», а после него «-».
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <cstdlib> #include <iostream> #include <cstring> using namespace std; int main(){ string s; getline(cin, s, '\n'); int count_plus = 0; for( int i=0 ; i<s.length() ; i++ ){ if(s[i] == '-'){ count_plus++; } } string s2; s2.resize(s.length()+count_plus); for( int i=0,k=0 ; i<s.length() ; i++,k++ ){ if(s[i] != '-'){ s2[k] = s[i]; }else{ s2[k] = '+'; s2[++k] = '-'; } } cout << s2 << endl; } |
Тесты:
Строка | Результат |
ef34_ve-ev-++vev)- |
ef34_ve+-ev+-++vev)+- |
3-5=8-10+0 |
3+-5=8+-10+0 |
Операция += в большинстве реализаций класса string практически всегда приводит к копированию строки на новое место. Т.е. поместив += в цикл Вы дабились квадратичной сложности алгоритма. Правильнее было бы вычислить длину результирующей строки в одном цикле, зарезервировать необходимое место в памяти, скопировать нужные элементы во втором цикле.
Засчитал, но оценка сильно снижена.
Понял, исправил.
Учёл. Осталось небольшое стилистическое замечание. Приведенный ниже фрагмент Вашего кода излишне усложнён. Нет необходимости вставлять ‘-‘ отдельной строкой — он такой же s[i], как и остальные символы.