题目:
给定一周内的某几天,把相邻三天及以上的天进行合并,比如,周一、周二、周四、周五、周六、周日,就可以合并为:周一、周二、周四-周日
输入描述
输入第一行为输入数字的个数n(1<=n<=7); 第二行n个数,代表1-7种某几个数字,分别表示周一至周日,数字键用空格隔开。
输出描述:
输出为一行,合并后的数字,三天及其以上被合并后的数字,中间用减号(-)连接,其他用空格分开。
示例:
输入
6 1 2 3 4 6 7
输出
1-4 6 7
原理:
原理,找出不一样的值,从而判断该不该输出。
cnt表示在一段数据是否连续,1表示新的连续区间,为了把所有情况都列举,故不仅限制1-7的数值;
以下两个结尾对应不同情况,距离时,只用其中一个;
粗体表示数值,正常表示cnt
数值a 1 2 3 4 6 7 9 10 11(结尾) 12(结尾) 连续的标记cnt(第一种) 1 2 3 4 1 2 1 2 3 连续的标记cnt(第二种) 1 2 3 4 1 2 1 2 1 cnt=1输出 cnt++ cnt++ cnt++ 不连续
4>2,输出-4,最后cnt置1,并输出6
cnt++ 不连续
<1<2<=2,输出" 7",最后cnt置1,并输出9
cnt++ cnt++
由于是连续的,这里不输出,故要在最后输出11
不连续的,输出12,最后不需要手动输出 cnt置为1的原因 由于6与4不连续,故置1 由于9与7不连续,故置1 步骤:
1.第一个数值必须取出;
2.从第二个数值开始遍历,如果碰到不连续的数,此时判断如何输出
1)前一个数的cnt>2(即大于等于3)输出(-上一个数据);
2)前一个数的2=>cnt>1输出(【空格】上一个数据);
3)前一个数字等于cnt=1,必输出(【空格】上一个数据)
4)将cnt重新置为1(因为新的连续区间)
5)最后判断是连续结尾还是不连续结尾,连续的话,最后输出,不连续在上面的过程中已经输出
(注:如果当前位置的数等于前一个位置的数+1,即表示连续)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool DES(int a, int b) { return a < b; }//升序排列方法****更新
int main()
{
int N;
vector<int> a;//存放数组
cin >> N;
for (int i = 0; i < N; i++)
{
int temp;
cin >> temp;
a.push_back(temp);
}
sort(a.begin(), a.end(),DES);//排序****更新
int cnt = 1;//标记是否重复,若为1,则打印出来;若1前面的值大于2,则打印出来
cout << a[0];
for (int i = 1; i < N; i++)
{
if (a[i] != a[i - 1] + 1)
{
if (cnt > 2)
{
cout << "-" << a[i - 1];
}
else if (cnt > 1)
cout << " " << a[i - 1];
cnt = 1;
if (cnt == 1)
cout << " " << a[i];
}
else
cnt++;
}
if (cnt > 1)
cout << " " << a[N - 1];
system("pause");
return 0;
}