2021.4.2阿里巴巴后端工程师笔试题第一题

元素个数

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

  • 输入

    第一行代表T组测试数据

    接下来,每一组第一行输入一个整数n代表这一组的元素个数

    接下来代表序列的每一个元素

  • 输出

    对每组数据输出一个数代表有多少不同的整数

示例

  • 输入

    2
    6
    1 2 2 2 5 6
    2
    4 4
    
  • 输出

    5
    2
    

  这道题和2020年字节春招笔试题的第一道聪明的编辑思路相同,实际就是把输入的数组中相同的两个数中第二个数加一,两个数以上的话就把中间的数字都删掉,然后从加一的这个数在开始判断和后面的数是否相同。

  把原始的数组通过上面的数组转化成了另一个数组,这个数组的每一个数都不相同,这个数组里元素的数量就是这道题的答案。

  难点就是在于要考虑到重复数字进行加一后会出现和后面的数字又重复的可能性。

public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T=scanner.nextInt();
        int[] t = new int[100000];
        int[] res = new int[100000];
        int count=0;
        while (T-->0){
            int n= scanner.nextInt();
            int ans=0;
            for (int i = 0; i < n; i++) {
                t[i] = scanner.nextInt();
            }
            int pointer=0;
            while(pointer<n){
                int temp=t[pointer];
                int cnt=0;//记录相同的元素数量
                while (pointer<n&&temp==t[pointer]){//判断当前pointer对应的元素和temp相等时,pointer往后移动一位,cnt加一
                    pointer++;
                    cnt++;
                }
//              if(cnt==1){//cnt等于一代表没有相同的元素,对应答案加一
//                  ans++;
//              }
                if (cnt>=2) {//代表相同的元素数量两个以上,答案加一后把序列中最后一位相同的元素加一后重新放回序列中进行比较
                    t[--pointer]+=1;//指向相同元素中的最后一个
                }
                ans++;
            }
            res[count]=ans;
            count++;
        }
        for (int i = 0; i < count; i++) {
            System.out.println(res[i]);
        }
	scanner.close();
    }
posted @ 2021-04-03 17:50  凊兰  阅读(232)  评论(0)    收藏  举报