8.8网易笔试题+AC代码

C++ 开发岗位笔试

做到现在的各公司笔试题,第一次做出来3道题,纪念一下!以后可能就没机会了。。。
  1. 第一题: 给个英文字母字符串,长度10^3以内,在后面加随便英文字母,找出最短回文字符串
  2. 第二题:给一堆(最多15)有价值的东西,均分给2个人,均分不了的,扔掉,求最小扔掉多少
  3. 第三题:n(不超过2000)个人排队买票,第i个人要么单独买票,要么和后面一个人一起买(反过来,就是可以和前面一个人买),单独买花费时间a[i],一起买是b[i],求最短时间,售票员可以回家。开始时间是早上08:00:00 am,输出结束时间。(12点都算am,这点弄错了,只能过65%,神奇的小试一下,ac了)
#include <bits/stdc++.h>
using namespace std;
inline bool check(string &s, int start, int end)
{
    int i = start, j = end;
    while (i < j && s[i] == s[j])
    {
        ++i, --j;
    }
    return i >= j;
}
int main(int argc, char const *argv[])
{
    string s;
    cin >> s;
    int length = s.size();
    int i;
    for (i = 0; i < length; ++i)
    {
        if (check(s, i, length - 1))
        {
            break;
        }
    }
    string prefix = s.substr(0, i);
    reverse(prefix.begin(), prefix.end());
    cout << s + prefix << endl;
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
int a[20];
int suffixSum[20];
int n;
int minLoss;
void dfs(int first, int second, int cost, int index)
{
    if (index >= n)
    {
        if (first == second)
            minLoss = min(minLoss, cost);
        return;
    }
    if (first == second)
        minLoss = min(minLoss, suffixSum[index] + cost);
    if (abs(first - second) > suffixSum[index])
        return;
    // 给first,给second,扔掉
    dfs(first + a[index], second, cost, index + 1);
    dfs(first, second + a[index], cost, index + 1);
    dfs(first, second, cost + a[index], index + 1);
}
int main(int argc, char const *argv[])
{
    int t;
    cin >> t;
    while (t--)
    {
        scanf("%d", &n);
        for (int i = 0; i < n; ++i)
            scanf("%d", &a[i]);
        memset(suffixSum, 0, sizeof(suffixSum));
        for (int i = n - 1; i >= 0; --i)
            suffixSum[i] = suffixSum[i + 1] + a[i];
        minLoss = INT32_MAX;
        dfs(0, 0, 0, 0);
        cout << minLoss << endl;
    }
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
int a[2020];
int b[2020];
int dp[2020][3];
int main(int argc, char const *argv[])
{
    int t;
    cin >> t;
    while (t--)
    {
        int n;
        cin >> n;
        for (int i = 1; i <= n; ++i)
            scanf("%d", &a[i]);
        for (int i = 1; i <= n - 1; ++i)
            scanf("%d", &b[i]);
        b[0] = a[1];
        memset(dp, 0, sizeof(dp));
        dp[0][0] = 0;
        dp[0][1] = a[0];
        dp[0][2] = 0;
        for (int j = 1; j <= n; ++j)
        {
            if (j >= 1)
            {
                // j 单独买
                dp[j][0] = min(dp[j - 1][2], dp[j - 1][0]) + a[j];
                // j 和 j+1 一起买
                dp[j][1] = min(dp[j - 1][0], dp[j - 1][2]) + b[j];
            }
            else
            {
                // j 单独买
                dp[j][0] = a[j];
                // j 和 j+1 一起买
                dp[j][1] = b[j];
            }
            // j 和 j-1 一起买
            if (j >= 2)
                dp[j][2] = min(dp[j - 2][0], dp[j - 2][2]) + b[j - 1];
            else
                dp[j][2] = b[j - 1];
        }
        int seconds = min(dp[n][0], dp[n][2]);
        int hour = seconds / 3600 + 8;
        int minutes = seconds % 3600 / 60;
        seconds = seconds % 3600 % 60;
        printf("%02d:%02d:%02d", hour, minutes, seconds);
        // 12点是 am,少了等号,只能过65%的测试用例
        if (hour <= 12)
            printf(" am\n");
        else
            printf(" pm\n");
    }
    return 0;
}


#笔试题目##网易#
全部评论
第一次发帖,看到有人赞我,莫名开心。 我在这里,简要说一下思路。 第一题,就是暴力,从字符串开头,扫,substr(i, length-1)只要是回文串,这时,只要把(0, i)追加到字符串末尾,就ok了,当然记得(0,i)翻转过来。 第二题,还是暴力啊,看见n那么小,就最多15,妥妥的dfs+剪枝,从0到n-1,每次碰到一个,要么给a,要么给b,要么扔掉。在dfs过程中,当a == b时,更新 cost 最小值。这里剪枝,主要是发现a和b差太多了,把剩下的都给他,都补不上来,那还搜个啥。 第三题,n有2000,emmm,暴力n^2没想出来,dp想出来了。   dp[j][0]表示,到第j个人,且j选择单独买,要的最少时间;   dp[j][1]表示,j选择和后面人一起买,最少时间;   dp[j][2]表示,j选择和前面人一起买,最少时间;   然后,这些状态,和dp[j-1, 0/1/2]或者dp[j-2, 0/1/2]有关系了。
2
送花
回复 分享
发布于 2020-08-08 18:01
哦,少了个第4题,第3题做完,就time over了。 第4题,a教授认可b教授,b教授认可c教授,那么a也认可c。现有n (小于50000)个教授,m(小于600000)个认可,可能自己认可自己,也可能重复。求,互相认可的教授有多少,多少对?
点赞
送花
回复 分享
发布于 2020-08-08 17:09
现代汽车中国前瞻数字研发中心
校招火热招聘中
官网直投
跟我一样,最后一题还剩几分钟,开始 cout << 1,2,3,4,.....
点赞
送花
回复 分享
发布于 2020-08-08 17:32
d[j][2]是代表什么呢
点赞
送花
回复 分享
发布于 2020-08-08 17:44
老哥真强
点赞
送花
回复 分享
发布于 2020-08-08 17:50
代码最好在电脑端看,很清晰
点赞
送花
回复 分享
发布于 2020-08-08 17:51
只做出来2.5道,不知道有没有机会面试😂
点赞
送花
回复 分享
发布于 2020-08-08 17:54
均分物品的题目有没有大佬细讲一下,c++我看不太懂😢
点赞
送花
回复 分享
发布于 2020-08-08 19:21
太强了,来自只做出来一道的渣渣的仰望
点赞
送花
回复 分享
发布于 2020-08-08 19:57
老哥很稳,我还是没办法让自己在笔试时候不紧张,不然离三个AC也不远了
点赞
送花
回复 分享
发布于 2020-08-08 23:42
第三题65%,原来是12点是am还是pm的问题😥
点赞
送花
回复 分享
发布于 2020-08-09 10:11
我第三题也是65%,中午12点不应该是‘00:00:00 pm’吗?哭了
点赞
送花
回复 分享
发布于 2020-08-10 08:11
牛逼
点赞
送花
回复 分享
发布于 2020-08-10 08:35
博主你好,当a == b时,更新 cost 最小值,这部是什么意思呢,不太明白,这部分代码也是用来减枝的吗?
点赞
送花
回复 分享
发布于 2020-08-10 09:51
这多少分能有面试啊
点赞
送花
回复 分享
发布于 2020-08-10 11:23

相关推荐

13 46 评论
分享
牛客网
牛客企业服务