• 牛客刷题系列之进阶版(组队竞赛,排序子序列,倒置字符串, 删除公共字符,修理牧场)


    很多小伙伴为了刷题发愁
    今天为大家推荐一款刷题神奇哦:刷题面试神器牛客
    各大互联网大厂面试真题。从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官

    一:组队竞赛

    #include
    #include
    using namespace std;
    
    int main()
    {
        int n;
        cin >> n;
        int sum;
        sum =n*3;
        int arr[sum];
        for(int i=0;i<sum;i++)
        {
          cin >> arr[i];
        }
        sort(arr,arr+sum);
       long sums =0 ;
        int i=sum-2;
        while(n--)
        {
           sums+= arr[i];
            i-=2;
        }
        cout<<sums;
        
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 思路:
    1. 先排序
    2. 最优解是将最小的一个数和右边两个大数进行组队,这样得到的平均值最大
    • 注意:
    1. 注意排序函数要引用头文件

    二:排序子序列

    #include
    #include
    using namespace std;
    
    int main()
    {
        int n;
        cin >> n;
        int arr[n+1];
        arr[n]=0;
        for(int i=0;i<n;i++)
        {
          cin >> arr[i];
        }
        int a=0;
        int count =0;
        while(a<n)
        {
             if(arr[a]< arr[a+1])
             {
                     while(a<n && arr[a] <= arr[a+1])
                         a++;
             }
            else if(arr[a] == arr[a+1])
            {
                a++;
                continue;
            }
            else
            {
                     while(a<n && arr[a] >= arr[a+1])
                         a++;
            }
            a++;
            count++;
        }
        cout<<count;
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 思路:
    1. 先判断是升序还是降序,或者只是相同的
    2. 假如是升序或者降序,一直++,直到不为升序或者降序为止
    3. 假如是相同的,则直接++
    • 注意:
    1. 注意 开空间是开 n+1个空间,以防越界
    2. 注意要有相同情况下的判断,不然会出现这种 情况
      在这里插入图片描述

    假如没有相同情况的判断,会多加一次

    三:倒置字符串

    这里就不写常规的写法了,只介绍一种我觉得很巧妙的方法

    • 代码:
    #include
    using namespace std;
    
    int main()
    {
       string s1;
        string s2;
        cin>> s2;
        while(cin>> s1)
        {
           s2 = s1 + " "+ s2;
        }
        cout<< s2;
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 思路:
    1. 先输入一个单词到s1上
    2. 再循环输入,每次输入的单词都在上一个单词的前面
    3. 直到输入,即完成了逆置
    • 注意:
    1. 注意是 s2 = s1 + " "+ s2;
    • 启发:

    当我们面对一些让我们自己输入的题目时,我们可以先一开始不全部输入进去,一部分一部分的输入,一边输入一边处理

    四: 删除公共字符

    #include
    using namespace std;
    
    int main()
    {
       string s1;
       getline(cin,s1);
       string s2;
        cin>>s2;
        char arr[256]={0};
        for(int i=0;i<s2.size();i++)
        {
            arr[s2[i]] = 1;
        }
        
        auto it = s1.begin();
        string ret;
        for (it = s1.begin(); it != s1.end();it++)
    	{
    		if(arr[*it] == 0)
                ret+= *it;
        }
        cout<<ret;
    
      return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 注意:

    可以将要输出的内容保存到一个string里,可以减少很多不必要的运算

    五:修理牧场(利用堆 和 哈夫曼树思想的运用)

    • 题目:
      在这里插入图片描述
    • 代码:
    #include
    #include 
    using namespace std;
    int main()
    {
        int n, tatal = 0;
        cin >> n;
        priority_queue<int, vector<int>, greater<int>>  que;
        while (n--)
        {
            int tem;
            cin >> tem;
            que.push(tem);
        }
        while (que.size() > 1)
        {
            int a = que.top();
            que.pop();
            int b = que.top();
            que.pop();
            tatal += a + b;
            que.push(a + b);
        }
        cout << tatal;
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    这道题主要考的是对 堆,即优先级队列的运用

    • 注意:

    注意优先级队列的定义 priority_queueint >,great<int>> queue

    ps

    想和博主一样刷优质面试和算法题嘛,快来刷题面试神器牛客吧,期待与你在牛客相见

  • 相关阅读:
    SpringCloud链路追踪SkyWalking-第四章-自定义链路追踪
    IP在网络通信中的重要作用
    精读《素书》精彩语录及感悟篇(二)
    算法通关18关 | 回溯模板如何解决复原IP问题
    Numerov算法解一维无限深势阱的问题 (含量子力学导论)
    CKA真题分析-2023年度
    元数据管理平台对比预研 Atlas VS Datahub VS Openmetadata
    Unittest学习笔记
    案例研究|DataEase助力无锡布勒业务数据可视化建设
    在Ubuntu20.04安装Kylin4 On Docker并在DataGrip配置JDBC协议连接容器内Hive1.2.1及Kylin4.0.0
  • 原文地址:https://blog.csdn.net/yin_ming_hui/article/details/126017115