网易C++后台开发笔试编程题

第一题

给你n个数,m次询问。 每次询问x出现了多少次。 数据范围好像是1e5;
思路:
可以之间用unordered_map来存一下,当然你也可以自己写哈希;
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<ll, ll> pll;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define MAX_N 100010

int main() {
    #ifdef DEBUG
    freopen("data.txt", "r", stdin);
    #endif // DEBUG
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n, m;
    cin >> n >> m;
    unordered_map<int, int> F;
    for(int i = 0, tmp; i < n; i++)
    {
        cin >> tmp;
        F[tmp]++;
    }
    while(m--)
    {
        int tmp;
        cin >> tmp;
        cout << F[tmp] << endl;
    }

    return 0;
}

第二题

说一个人,有个无限容量的包(初始有m个积木),有n堆积木,第i堆有a[i]个, 每次可以进行 拿走一个 放上去一个 或者啥都不干操作;
问能不能使得最后严格单调递增。 数据范围好像是1e5

思路:
考虑最蠢的办法, 直接保证 第一堆积木有0个, 第二堆有1个, 以此类推
然后求一下所有积木 + m 是否 >= (0 + n - 1) * n / 2, 如果这都凑不够 那铁定凉凉;
如果可以够,还要考虑 如果后面的积木特别多, 前面背包里的积木不够补的情况;
在线维护一下就行了
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<ll, ll> pll;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define MAX_N 100010

int a[MAX_N];

int main() {
    #ifdef DEBUG
    freopen("data.txt", "r", stdin);
    #endif // DEBUG
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    while(t--)
    {
        ll sum = 0, n, m;
        cin >> n >> m;
        for(ll i = 0; i < n; i++)
        {
            cin >> a[i];
            sum += a[i];
        }
        sum += m;
        if(sum < (n - 1) * n / 2)
        {
            cout << "NO" << endl;
            continue;
        }
        int flag = 1;
        for(int i = 0; i < n; i++)
        {
            if(i == 0)
            {
                m += a[i];
            }
            else
            {
                if(a[i] > i)
                {
                    m += a[i] - i;
                }
                else
                {
                    if(m < i - a[i])
                    {
                        flag = 0;
                        break;
                    }
                    else
                    {
                        m -= i - a[i];
                    }
                }
            }
        }
        if(flag)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }

    return 0;
}



第三题

给你一个数组, 要满足 第i项 大于等于 前i-1项的和。  问你满足这样的最长连续子序列的长度

考虑可以先用前缀和预处理一下,然后在线维护一下即可;
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<ll, ll> pll;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define MAX_N 100010

ll a[MAX_N], sum[MAX_N];

int main() {
    #ifdef DEBUG
    freopen("data.txt", "r", stdin);
    #endif // DEBUG
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int t;
    cin >> t;
    while(t--)
    {
        memset(sum, 0, sizeof(sum));
        int n;
        cin >> n;
        for(int i = 1; i <= n; i++)
        {
            cin >> a[i];
            sum[i] += sum[i - 1] + a[i];
        }
        ll Max = 0, tmp_Max = 0, pre = 0;
        for(int i = 1; i <= n; i++)
        {
            if(a[i] >= sum[i - 1] - pre)
                tmp_Max++;
            else
            {
                Max = max(Max, tmp_Max);
                tmp_Max = 1;
                pre = sum[i - 1];
            }
        }
        cout << Max << endl;
    }

    return 0;
}

第四题

给你一个 数组 和一个 目标值。 可以对数组中的元素进行加或者减操作,代价就是差值。 现在要求操作后所有的数组元素乘机为目标值
问最小代价 n <= 1000

这道题我不会,考虑了唯一分解,但还是有很多情况, 求大佬说一下正解, 不过暴力骗分骗到了90%, 还有10%的应该是初始情况所有的乘积 < 目标值
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double, double> pdd;
typedef pair<ll, ll> pll;
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define MAX_N 100010

int a[MAX_N];

int main() {
    #ifdef DEBUG
    freopen("data.txt", "r", stdin);
    #endif // DEBUG
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n, key;
    cin >> n >> key;
    for(int i = 0; i < n; i++)
        cin >> a[i];
    sort(a, a + n, [](int tmp_a, int tmp_b) {return tmp_a > tmp_b;});
    int tmp_val = 1, flag = 0;
    for(int i = 0; i < n; i++)
    {
        tmp_val *= a[i];
        if(tmp_val > key)
        {
            flag = 1;
            break;
        }
    }
    if(flag)
    {
        int p = 1;
        vector<int> val;
        for(int i = 0; i < n; i++)
        {
            if(key % a[i] == 0)
            {
                key /= a[i];
                p *= a[i];
            }
            else
            {
                val.push_back(a[i]);
            }
        }
        if(key == 1)
        {
            int sum = 0;
            for(int i = 0; i < val.size(); i++)
                sum += val[i] - 1;
            cout << sum << endl;
        }
        else
        {
            sort(val.begin(), val.end());
            int pos = lower_bound(val.begin(), val.end(), key) - val.begin();
            if(pos == 0)
            {
                int sum = abs(key - a[0]);
                for(int i = 1; i < val.size(); i++)
                    sum += val[i] - 1;
                cout << sum << endl;
            }
            else
            {
                if(abs(key - val[pos]) < abs(val[pos - 1]))
                {
                    int sum = abs(key - val[pos]);
                    for(int i = 0; i < val.size(); i++)
                    {
                        if(i != pos)
                            sum += val[i] - 1;
                    }
                    cout << sum << endl;
                }
                else
                {
                    int sum = abs(key - val[pos - 1]);
                    for(int i = 0; i < val.size(); i++)
                    {
                        if(i != pos - 1)
                            sum += val[i] - 1;
                    }
                    cout << sum << endl;
                }
            }
        }
    }
    else
    {
        cout << rand() % 100 + 1 << endl;
    }

    return 0;
}



#笔试题目##校招##网易##C/C++#
全部评论
第二题我是每次判断够不够,不够就输出NO……一直只有10%对。。。
点赞 回复
分享
发布于 2019-09-21 17:06
第二题为啥只有30%
点赞 回复
分享
发布于 2019-09-21 17:08
阅文集团
校招火热招聘中
官网直投
求第四题思路,同只会暴力
点赞 回复
分享
发布于 2019-09-21 17:12
我想问一下第二题不是只能一次操作一个积木嘛,为什么你这块对m和a[i]直接有多于1个的操作
点赞 回复
分享
发布于 2019-09-21 17:14
我没有第四题,看你的描述和代码,有点困惑为什么去掉能整除key的数字以后,就直接把其他数字变1了。。不考虑乘积了嘛?
点赞 回复
分享
发布于 2019-09-21 17:19
第四题可以看下:https://www.nowcoder.com/discuss/273051
点赞 回复
分享
发布于 2019-09-21 17:21

相关推荐

2 10 评论
分享
牛客网
牛客企业服务