星期合并

题目:

给定一周内的某几天,把相邻三天及以上的天进行合并,比如,周一、周二、周四、周五、周六、周日,就可以合并为:周一、周二、周四-周日

输入描述

输入第一行为输入数字的个数n(1<=n<=7);
第二行n个数,代表1-7种某几个数字,分别表示周一至周日,数字键用空格隔开。

输出描述:

输出为一行,合并后的数字,三天及其以上被合并后的数字,中间用减号(-)连接,其他用空格分开。

示例:

输入

6

1 2 3 4 6 7

输出

1-4 6 7

原理:

原理,找出不一样的值,从而判断该不该输出。

cnt表示在一段数据是否连续,1表示新的连续区间,为了把所有情况都列举,故不仅限制1-7的数值;

以下两个结尾对应不同情况,距离时,只用其中一个;

粗体表示数值,正常表示cnt

数值a12346791011(结尾)12(结尾)
连续的标记cnt(第一种)123412123 
连续的标记cnt(第二种)12341212 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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值