//把1,4,5-8,9,89,11-14 => 1,4-9,11-14,89
//思路:先把这个字符串使用strtok按照","记性分解;
//把每个字符分解好的串中的"-"进行解析;
//把解析之后的转成数字数组并排序
//把排好序的数字数字连接成目标字符串
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <stdlib.h>
using namespace std;
typedef vector<int> vInt;
typedef vector<int>::iterator itInt;
typedef vector<char *> vStr;
typedef vector<char *>::iterator itStr;
//将字符串以","为界限进行分割
vStr parseStr(char *pStr){
char *p;
vStr vtmp;
p=strtok(pStr,",");
while(p!=NULL){
vtmp.push_back(p);
p=strtok(NULL,",");
}
return vtmp;
}
//对"-"进行解析
char* find(char *str1,char ch){
char *tmp=str1;
bool flag=false;
while(*tmp!='\0'){
if(*tmp == ch)
return tmp;
tmp++;
}
return NULL;
}
//将字符串转为int数组
vInt parase(vStr vstr){
vInt vtmp;
for(itStr it=vstr.begin();it!=vstr.end();it++){
if(find(*it,'-')==NULL)
vtmp.push_back(atoi(*it));
else{
char *p=find(*it,'-');
int m=atoi(*it);
int n=atoi((++p));
for(int i=m;i<=n;i++)
vtmp.push_back(i);
}
}
return vtmp;
}
//把排序好的数字数组,按照要求划分字符字串
vStr concat(vInt vint){
vStr vtmp;
for(itInt it=vint.begin();it!=vint.end();it++){
static char ch[]="-";
char *p=new char[10];
//这里注意判断最后一个元素,否则会越界
if((it+1)==vint.end())
vtmp.push_back(itoa(*it,p,10));
else if(*it+1 != *(it+1)){
vtmp.push_back(itoa(*it,p,10));
}
else{
vtmp.push_back(itoa(*it,p,10));
vtmp.push_back(ch);
while(it!=vint.end() && *it+1 == *(it+1)){
it++;
}
char *q=new char[10];
vtmp.push_back(itoa(*it,q,10));
}
}
return vtmp;
}
//把分解好的字串拼接成最终要求的字符串
string func(vStr v02){
string str="";
for(itStr it=v02.begin();it!=v02.end();it++){
str+=*it;
//这里注意不能直接使用*it,因为这样取出的是一个字符
string str01=*it;
string str02="";
if(it+1 != v02.end())
str02=*(it+1);
if(str01!="-" && str02!="-")
str+=",";
}
return str;
}
int main()
{
vInt vint;
vStr vstr;
vStr v02;
string str;
//char pStr[]="1,4,5-8,9,89,11-14";
char pStr[]="1,4,5-8,3,9,89,15,11-14";
vstr=parseStr(pStr);
vint=parase(vstr);
sort(vint.begin(),vint.end()); //排序
v02=concat(vint);
str=func(v02);
cout << str << endl;
return 0;
}