Матч 15, Числа в ряд (NumbersLine)

 

В строке записаны числа, разделенные пробелами. Необходимо в ней найти число, строго большее givenNumber. Если такого числа не существует, то вывести -1.

 

Класс: NumbersLine

Метод: int getLeast(string line, int givenNumber)

Ограничения: line содержит от 1 до 50 символов, каждый из которых является цифрой или пробелом, числа в строке line лежат в промежутке от 1 до 1000 включительно и не имеют ведущих нулей, line содержит как минимум одно число, 1 £ givenNumber £ 1000.

 

Вход. Строка line, содержащая последовательность чисел, разделенных пробелом, и число givenNumber.

 

Выход. Число в строке, строго большее givenNumber. Если такого числа не существует, то вывести -1.

 

Пример входа

line

givenNumber

“1 2 3 4 5”

2

“120 450 780”

1000

   45  253 645 400   676 567 

1

 

Пример выхода

3

-1

45

 

 

РЕШЕНИЕ

обработка строк + поиск

 

Занесем все числа в вектор num. Чтение чисел из строки line организуем при помощи потокового вывода из переменной in типа stringstream. Далее отсортируем массив и при помощи функции upper_bound найдем число, строго большее givenNumber. Если такого числа не существует, то выводим -1.

 

ПРОГРАММА

 

#include <cstdio>

#include <string>

#include <vector>

#include <algorithm>

#include <sstream>

using namespace std;

 

class NumbersLine

{

public:

  int getLeast(string line, int givenNumber)

  {

    vector<int> num;

    stringstream in(line);

    int a;

    while(in >> a) num.push_back(a);

    sort(num.begin(),num.end());

    a = upper_bound(num.begin(),num.end(),givenNumber) - num.begin();

    if (a >= num.size()) return -1 ; else return num[a];

  }

};