网易2019实习生招聘编程题解答

这篇博客介绍了网易2019年实习生招聘中的一些编程题目,包括工作选择问题、数列中被3整除的数的数量、路灯安置策略、方向判断、数对余数问题、矩形重叠计算、闹钟设定和背包问题的解题思路和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题一:
牛牛找工作
为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。

/***************************************************************************
*  @file       main.c
*  @author     HAOJIEFENGLANG
*  @date       13  August 2018
*  @remark     13  August 2017
*  @theme      牛牛找工作
/***************************************************************************
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n, m;
    while (cin >> n >> m) 
    {
        vector<pair<int, int> > job(n + 1), guy(m);
        vector<int> map(m);
        int mx = 0, index = 0, left = 0;
        job[0] = make_pair(0, 0);
        for (int i = 1; i <= n; ++i) 
        {
            cin >> job[i].first >> job[i].second;
        }
        for (int i = 0; i < m; ++i) 
        {
            cin >> guy[i].first;
            guy[i].second = i;
        }
        sort(job.begin(), job.end(), [&](pair<int, int> a, pair<int, int> b) {return a.first < b.first; });
        sort(guy.begin(), guy.end(), [&](pair<int, int> a, pair<int, int> b) {return a.first < b.first; });
        for (int i = 0; i <= n; ++i)
        {
            mx = max(mx, job[i].second);
            job[i].second = mx;
        }
        while (left < m && index < n + 1)
        {
            if (guy[left].first >= job[index].first) 
                ++index;
            else 
            {
                map[guy[left].second] = job[index - 1].second;
                ++left;
            }
        }
        for (int i = left; i < m; ++i)
        {
            map[guy[i].second] = job[n].second;
        }
        for (int i = 0; i < m; ++i) 
        {
            cout << map[i] << endl;
        }
    }
}

问题二:
被3整除(找规律题)
小Q得到一个神奇的数列: 1, 12, 123,…12345678910,1234567891011…。
并且小Q对于能否被3整除这个性质很感兴趣。
小Q现在希望你能帮他计算一下从数列的第l个到第r个(包含端点)有多少个数可以被3整除。

/***************************************************************************
*  @file       main.c
*  @author     HAOJIEFENGLANG
*  @date       13  August 2018
*  @remark     13  August 2017
*  @theme      被3整除
/***************************************************************************
#include<stdio.h>

int main()
{
    int l = 0, r = 0;
    int result = 0;
    scanf_s("%d%d", &l, &r);
    for (int i = l; i <= r; i++)
    {
        switch (i % 3)
        {
        case 0:result++; break;
        case 1:; break;
        case 2:result++; break;
        }
    }
    printf("%d\n", result);
}

问题三:
安置路灯

小Q正在给一条长度为n的道路设计路灯安置方案。
为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用’.’表示, 不需要照亮的障碍物格子用’X’表示。
小Q现在要在道路上设置一些路灯, 对于安置在pos位置的路灯, 这盏路灯可以照亮pos - 1, pos, pos + 1这三个位置。
小Q希望能安置尽量少的路灯照亮所有’.’区域, 希望你能帮他计算一下最少需要多少盏路灯。

/***************************************************************************
*  @file       main.c
*  @author     HAOJIEFENGLANG
*  @date       13  August 2018
*  @remark     13  August 2017
*  @theme      安置路灯
/***************************************************************************
#include<stdio.h>
#include<string.h>
int calcu(int len, char str[]);

struct node
{
    int length;
    char str[1000];
};
int main()
{
    int t = 0;
    node road[1000] = { 0 };
    int cnt = 0;
    scanf("%d", &t);
    for (int i = 0; i<t; i++)
    {
        scanf("%d", &road[i].length);
        scanf("%s", &road[i].str);
    }
    for (int i = 0; i<t; i++)
    {
        cnt = calcu(road[i].length, road[i].str);
        printf("%d\n", cnt);
    }
    return 0;
}
int calcu(int len, char str[])
{
    int result = 0;
    for (int i = 0; i<len;)
    {
        if (str[i] == 'X')
        {
            i++;
            continue;
        }
        if (str[i] == '.' || str[i + 1] == '.' || str[i + 2] == '.')
        {
            result++;
        }
        i += 3;
    }
    return result;
}

问题四:
迷路的牛牛

牛牛去犇犇老师家补课,出门的时候面向北方,但是现在他迷路了。虽然他手里有一张地图,但是他需要知道自己面向哪个方向,请你帮帮他。

/***************************************************************************
*  @file       main.c
*  @author     HAOJIEFENGLANG
*  @date       13  August 2018
*  @remark     13  August 2017
*  @theme      迷路的牛牛
/***************************************************************************
#include<stdio.h>
#include<string.h>

int main()
{
    int N = 0;
    char direct[1001];//字符串输入还有一个空字符加入尾巴;所以长度要加1,为1001
    char pre = 'N';
    char result;
    scanf_s("%d", &N);
    scanf_s("%s", direct);
    for (int i = 0; i<N; i++)
    {
        switch (pre)
        {
        case 'E':
        {
            if (direct[i] == 'L')
                pre = 'N';
            else
                pre = 'S';
            break;
        }
        case 'W':
        {
            if (direct[i] == 'L')
                pre = 'S';
            else
                pre = 'N';
            break;
        }
        case 'N':
        {
            if (direct[i] == 'L')
                pre = 'W';
            else
                pre = 'E';
            break;
        }
        case 'S':
        {
            if (direct[i] == 'L')
                pre = 'E';
            else
                pre = 'W';
            break;
        }
        }
    }
    printf("%c", pre);
    return 0;
}

问题五:
数对

牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对

/***************************************************************************
*  @file       main.c
*  @author     HAOJIEFENGLANG
*  @date       13  August 2018
*  @remark     13  August 2017
*  @theme      数对
/***************************************************************************
#include<stdio.h>

int main()
{
    long long result = 0;
    int n = 0, k = 0;
    scanf_s("%d%d", &n, &k);
    for (int y = k+1; y<= n; y++)
    {

        result += (n / y)*(y - k) + (n %y - k + 1>0? n % y - k + 1: 0);
        if (k == 0)
            result--;

    }
    printf("%lld", result);
    return 0;
}

问题六:
矩形重叠

平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。
如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。
请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。

思路:(注意判断重叠矩形数量最多的地方:遍历所有可能包含的点,看一下有多少矩形包含它
注:重叠数量最多的地方肯定是一块矩形区域
误区:A和B交,B和C交,但是A不和C交 — B同时和A,C交, 但是重叠区域只为1)

/***************************************************************************
*  @file       python 2.7.3
*  @author     HAOJIEFENGLANG
*  @date       13  August 2018
*  @remark     13  August 2017
*  @theme      矩形重叠
/***************************************************************************
import sys
lines = sys.stdin.readlines()
n = int(lines[0])
x1 = list(map(int, lines[1].split()))
y1 = list(map(int, lines[2].split()))
x2 = list(map(int, lines[3].split()))
y2 = list(map(int, lines[4].split()))

res = 1
for x in x1 + x2:
for y in y1 + y2 :
    cnt = 0
    for i in range(n) :
        if x > x1[i] and y > y1[i] and x <= x2[i] and y <= y2[i]:
cnt += 1
res = max(res, cnt)
print(res)

问题七:
牛牛闹钟

牛牛总是睡过头,所以他定了很多闹钟,只有在闹钟响的时候他才会醒过来并且决定起不起床。从他起床算起他需要X分钟到达教室,上课时间为当天的A时B分,请问他最晚可以什么时间起床

/***************************************************************************
*  @file       main.c
*  @author     HAOJIEFENGLANG
*  @date       13  August 2018
*  @remark     13  August 2017
*  @theme      牛牛闹钟
/***************************************************************************
#include<stdio.h>
#include<algorithm>
using namespace std;
struct clock_niu
{
    int H;
    int M;
    int id;
};

int main()
{
    int N = 0;
    clock_niu clo[100];
    int X = 0;
    int clock_minute[100];
    int clock_minute0[100];
    int pos[100] = { 0 };
    int min = 0;
    int temp = 0;
    int target = 0;
    clock_niu classs;
    scanf_s("%d", &N);
    for (int i = 0; i<N; i++)
    {
        scanf_s("%d%d", &clo[i].H, &clo[i].M);
        clo[i].id = i;
        clock_minute[i] = clo[i].H * 60 + clo[i].M;
    }
    scanf_s("%d", &X);
    scanf_s("%d%d", &classs.H, &classs.M);
    target = classs.H * 60 + classs.M;
    memcpy(clock_minute0, clock_minute, N*sizeof(int));
    sort(clock_minute,clock_minute+N);
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            if (clock_minute0[j] == clock_minute[i])
            {
                pos[i] = j;
                break;
            }
        }

    for (int i = N - 1; i >= 0; i--)
    {
        if (clock_minute[i]<target&&target - clock_minute[i] >= X)
        {
            printf("%d %d\n", clo[pos[i]].H, clo[pos[i]].M);
            break;
        }
    }
    return 0;
}

问题八:
每题得分

牛牛准备参加学校组织的春游, 出发前牛牛准备往背包里装入一些零食, 牛牛的背包容量为w。
牛牛家里一共有n袋零食, 第i袋零食体积为v[i]。
牛牛想知道在总体积不超过背包容量的情况下,他一共有多少种零食放法(总体积为0也算一种放法)。

//如果所有物品加起来都没超过总重量,那么直接可以使用使用公式 nums = pow(2,n); //如果所有物品加起来没有超过总重量,这题由于总容量很大,不考虑动态规划。
//然而发现物品很少,不超过30个,那么考虑使用深搜。 代码如下:
/***************************************************************************
*  @file       main.c
*  @author     HAOJIEFENGLANG
*  @date       13  August 2018
*  @remark     13  August 2017
*  @theme      每题得分
/***************************************************************************
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

long long nums = 1;
void DFS(vector<long long>& array, int size, long long w, long long sum, int pos)
{
    if (sum <= w)
    {
        nums++;
        for (int i = pos + 1; i < size; ++i)
        {
            DFS(array, size, w, sum + array[i], i);
        }
    }
}
int main()
{
    int n;
    long long  w;
    cin >> n >> w;
    long long total = 0;
    vector<long long > array(n, 0);
    for (int i = 0; i != n; ++i)
    {
        cin >> array[i];
        total += array[i];
    }
    if (total <= w)
    {
        nums = pow(2, n);
    }
    else
    {
        sort(array.begin(), array.end());
        for (int i = 0; i != n; ++i)
            DFS(array, array.size(), w, array[i], i);
    }
    cout << nums << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值