C++笔试训练day_1

文章目录

  • 选择题
  • 编程题

选择题

C++笔试训练day_1_第1张图片

编程题

C++笔试训练day_1_第2张图片
C++笔试训练day_1_第3张图片

#include 
#include 
#include 

using namespace std;

int main() {
    int n = 0;
    cin >> n;

    vector<int> v;
    v.resize(3 * n);
    int x = 0;
    for(int i = 0; i < v.size(); i++)
    {
        cin >> v[i];
    }

    sort(v.begin(), v.end());
    //int sum = 0;
    long long sum = 0;
    for(int j = 0; j < n; j++)
    {
        sum += v[v.size() - (j + 1) * 2];
    }
    cout << sum << endl;

    return 0;
}
// 64 位输出请用 printf("%lld")

在本题中最重要的就是怎么进行分组,然后怎么取到每组里面的中位数:我们选择通过resize扩容vector然后输入数据,去对这组数据进行排序,而分组方式是第一组取一个最小值和最大的两个值,第二组取次小值和次大的两个值,一次类推,这样就保证了我们一定可以去取到次大的值。
C++笔试训练day_1_第4张图片
因此中位数就是和6,结果sum就是9
而在已经排好序的vector中怎么直接去取到这两组中的中位数呢?
此时就要借助一个公式:**v.size() - 2 * (i + 1)**其中i表示第几组
第0组也就是第1组:中位数下标为6 - 2 = 4
第1组也就是第2组:中位数下标为6 - 4 = 2
其实这个公式也就是从后向前依次取倒数第2个值,size - 2,size - 4就是倒数第二个值和倒数第4个值,注意size值比下标多1
2.
C++笔试训练day_1_第5张图片
C++笔试训练day_1_第6张图片

#include 
using namespace std;

int main() {
    string str1, str2;
    getline(cin, str1);
    getline(cin, str2);
    int hash[256] = {0};
    for(int i = 0; i < str2.size(); i++)
    {
        hash[str2[i]]++;
    }

    string s;
    for(int j = 0; j < str1.size(); j++)
    {
        if(hash[str1[j]] == 0)
        {
            s += str1[j];
        }
    }
    cout << s << endl;
    return 0;
}
// 64 位输出请用 printf("%lld")

解题思路:利用哈希映射的特性来解决上述问题,就可以以O(n)的复杂度解决问题,先把不能出现的字符映射到hash表上,在对str1进行遍历,如果它在hash上对应的字符为0,就证明这个字符能出现。注意本题使用getline输入一行字符串

你可能感兴趣的:(笔试,c++,哈希算法,开发语言)