阿里后端笔试之元素个数 -- 2021/04/02 - 凌宸1642

阿里后端笔试之元素个数 -- 2021/04/02 - 凌宸1642

题目描述:

小明现在有一个长度为 N 的不递减序列,你可以操作任意次,每一次操作可以让某一个位置上的数加 1,但每个位置的数最多只能操作一次,通过这个操作,能让新产生的序列中有多少个不同的数。


输入描述:

第一行代表 T 组测试数据 。接下来,每组数据占两行,第一行输入一个整数 N 代表这一组的元素个数 , 第二行输入包含表示该序列的 N 个元素


输出描述:

对于每组测试用例,在一行中输出最多能让新序列中有多少个不同的数。


样例输入:

2
6
1 2 2 2 5 6
2
4 4

样例输出:

5
2

解题思路:

这题看上去很简单,但是在实际笔试的时候还是有点慌乱了,导致没有做出来。

具体思路看代码


完整代码:

#include<bits/stdc++.h>
using namespace std;
int t , n , temp ; 
vector<int> num ; // 用向量存储输入的数据
int main(){
	cin >> t ;
	while(t --){
		num.clear() ; // 每组数据输入之前,需要先把原来的数据清空
		cin >> n ;
		for(int i = 0 ; i < n ; i ++){
			cin >> temp ;
			num.push_back(temp) ;
		}
		int ans = 0 , index = 0 ; // ans 表示答案,index指向当前元素下标
		while(index < n){
			temp = num[index] ; // temp 等于当前元素
			int cnt = 1 ; // cnt 记录当前元素的个数 
			while(index < n && temp == num[++ index]) cnt ++ ;// 统计当前数字的个数
			if(cnt >= 2) num[-- index] ++ ; // 如果当前数字的个数大于2,那么把当前数字的最后一个加1
			ans ++ ; // while循环一次,我们就能找到一个元素
		}
		cout << ans <<endl ; // 输出本组测试数据的答案
	}
	return 0 ;
}
posted @ 2021-04-03 22:01  凌宸1642  阅读(84)  评论(0编辑  收藏  举报