Написать функцию, которая заменяет все числа, встречающиеся в строке на наименьшее из них

81
16 декабря 2021, 02:20

Написала функцию, но она меняет числа посимвольно =(

#include <iostream>
#include <string>
using namespace std;
void MinimizeNumbers(string &src);

int main(){

    string str;
    MinimizeNumbers(str);

    return 0;
}
void MinimizeNumbers(string &src){
    getline (cin, src);
    char min = 999999;
    for (int i= 0; i < src.length(); i++){  
      if(isdigit(src[i]) ){
        if(src[i] < min)
          min = src[i];
        src[i] = min;
      }
    }
    cout  << src;
}

При вводе 2 15 44 выдает 2 22 22, а нужно чтобы выдавала 2 2 2

Answer 1

Вот, как смог (осталось только разбить на функции):

#include <iostream>
#include <sstream>
#include <cctype>
#include <climits>
#include <string>
int main()
{
    using namespace std;
    string input;
    cout << "Input >> ";
    getline(cin, input);
    istringstream instr(input);
    int minValue = INT_MAX;
    int currentValue;
    // Пропускаем все символы пока не встретим первую цифру
    while (instr && !isdigit(instr.peek()))
    {
        instr.get();
    }
    // Если мы не дошли до конца строки и встретили первую цифру, то читаем все число
    while (instr >> currentValue)
    {
        // Определяем меньше ли это число предыдущего и повторяем
        minValue = currentValue < minValue ? currentValue : minValue;
        while (instr && !isdigit(instr.peek()))
        {
            instr.get();
        }
    }

    istringstream inResult(input);
    string result;
    // Заносим все символы из входной строки до первого числа
    while (inResult && !isdigit(inResult.peek()))
    {
        result += inResult.get();
    }
    // Если встретили число, читаем его (что бы пропустить)
    while (inResult >> currentValue)
    {
        // а вместо него вставляем наше минимальное число и повторяем
        result += to_string(minValue);
        while (inResult && !isdigit(inResult.peek()))
        {
            result += inResult.get();
        }
    }
    // Вывод результатов
    cout << input << endl;
    cout << result << endl;
    return 0;
}
Answer 2

Ловите страшный костыль ) Но работает как танк)

 #include <iostream>
#include <string>
#include <sstream>

int main() {
    std::string line{"aa 12 2 1 123 s2 31 4 ss"};
    std::istringstream ss{line};
    std::string s;
    int min{std::numeric_limits<int>::max()};
    while(ss >> s) {
        int n{};
        std::istringstream iss (s);
        iss >> n;
        if (iss.fail()) {
            continue;
        }
        min = std::min(min, n);
    }
    std::istringstream ss2{line};
    std::string s2;
    while(ss2 >> s2) {
        int n{};
        std::istringstream iss (s2);
        iss >> n;
        if (iss.fail()) {
            std::cout << s2 << " ";
            continue;
        }
        std::cout << min << " ";
    }
    std::cout << std::endl;

    return 0; 
}
READ ALSO
Как вычислить скорость загрузки файла через QNetworkAccessManager

Как вычислить скорость загрузки файла через QNetworkAccessManager

Попробовал так, но не получил адекватных значений

83
c++ Нужно оптимизировать задачу

c++ Нужно оптимизировать задачу

задания YandexContest: Даны массив А и В

92
c++ длинные синонимы через using

c++ длинные синонимы через using

Подскажите, можно ли средствами C++ как-нибудь реализовать новый тип, состоящий из нескольких слов, как long int, что-то типа

109
Как получить номер элемента в linq?

Как получить номер элемента в linq?

У меня есть список объектов linq Объект:

114