A format for expressing an ordered list of integers is to use a comma separated list of either
individual integers
or a range of integers denoted by the starting integer separated from the end integer in the range by a dash, '-'. The range includes all integers in the interval including both endpoints. It is not considered a range unless it spans at least 3 numbers. For example ("12, 13, 15-17")
Complete the solution so that it takes a list of integers in increasing order and returns a correctly formatted string in the range format.
#include <string>
#include <vector>
using std::to_string;
std::string range_extraction(std::vector<int> args)
{
std::string res = to_string(args[0]);
bool is_range = false;
for (int i = 1, prev = args[0], range_len = 0;
i < args.size(); prev = args[i++])
{
int fi = i == args.size()-1;
if (args[i] == prev+1)
{
is_range = true;
range_len++;
}
if (fi) //special logic for the last element
{
if (range_len > 1 && args[i] == prev+1)
res+='-'+ to_string(args[i]);
else if (range_len > 1) // but last element is not part of the seq
res+='-'+ to_string(args[i-1])+','+to_string(args[i]);
else if (range_len == 1 && args[i] != prev+1)
res+=',' + to_string(args[i-1]) +','+to_string(args[i]);
else
res+=',' + to_string(args[i]);
break;
}
else if(args[i] != prev+1) // non sequence logic
{
if(range_len) //we got here every time when sequence ends
{
if (range_len > 1)
res+='-'+ to_string(args[i-1]);
else if (range_len == 1)
res+=',' + to_string(args[i-1]);
range_len = 0;
is_range = false;
}
res+=',' + to_string(args[i]);
}
}
return res;
}