У меня есть задание, в котором нам нужно взять строку s и позицию pos, и мне нужно «собрать» все целые числа в позиции. Например, если сказать 3 abcdef123, должно получиться abc123def (целые числа начинаются с позиции 3). Главная, где эти параметры приняты, не изображена.
Пример ввода может выглядеть так:
5 ab1cdefgh (1 перемещается на 5-й индекс)
6 1abcdefgh (1 перемещается на 6-й индекс)
8 1abcdefgh (1 перемещается в конец)
8 abcdefgh1 (1 не двигается)
0 1abcdefgh
-1 (выйти)
void gatherDigits(std::string& s, const int pos) {
int ints = 1;
int size = s.size();
for (int i = 0; i < size; i++) {
if (std::isdigit(s.at(i))) {
ints++;
}
}
s = "";
char letter;
char l;
int count = 0;
for (letter = 'a'; letter <= 'z'; letter++) {
if (count == pos) {
l = letter;
break;
}
s = s + letter;
count++;
}
for (int i = 1; i < ints; i++) {
if (i == 10) {
s = s + std::to_string(0);
}
else {
s = s + std::to_string(i);
}
}
for (int i = pos + ints; i < size + 1; i++) {
s = s + l;
l++;
}
}
Однако я столкнулся с затруднительным положением. Я не уверен, считается ли это жестким кодированием (нам явно указано не использовать жесткий код). Единственные переменные, которые нам разрешено использовать, это int и char, поэтому я настроил их таким образом. Кроме того, все входные примеры представлены в нижнем регистре от a до z и от 0 до 9 целых. Наш код должен выполняться за время O(n^2).
Более сложный ввод может выглядеть так:
6 12ab3cdefghij456klm7n8op9q0
Предлагаемое решение включает использование операторов подкачки. Мой код отвечает всем остальным требованиям, за исключением отсутствия операторов swap. В конце концов, я просто спрашиваю: можно ли считать это жестким программированием?
std
передisdigit
? 16.02.2016std::stable_partition
обычно выделяет дополнительный буфер памяти. Однако оба решения решают разные задачи, и я все равно не проводил никаких измерений. 16.02.2016std
изstd::isdigit
, потому что он не компилируется :-). 16.02.2016#include <cctype>
: coliru.stacked-crooked.com/a/8c0dfde75828c7b9 16.02.2016<locale>
, который вводит функцию шаблона с тем же именем, поэтому компилятор не может решить, какую функцию использовать, что приводит к ошибке компилятора, которую вы видите. 16.02.2016std
иначе у вас двусмысленность. Вы можете либо исправить это с помощью лямбды, которая перенаправляет наstd::isdigit
, либо привести ее к правильному указателю функции, либо вызвать версию C, что я и сделал. Не стесняйтесь переходить на любую версию, которую вы предпочитаете (но эта самая короткая). 16.02.2016