阿里后端笔试之元素个数 -- 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 ;
}