网易2019校招笔试编程题参考代码

表达式求值

思路

考虑所有可能的表达式取最大值。

时间复杂度

O(1)

参考代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main() {
    int a, b, c;
    cin >> a >> b >> c;
    int ans = a + b + c;
    ans = max(ans, (a + b) * c);
    ans = max(ans, a + b * c);
    ans = max(ans, a * b + c);
    ans = max(ans, a * (b + c));
    ans = max(ans, a * b * c);
    cout << ans << endl;
    return 0;
}

俄罗斯方块

思路

用数组来模拟即可

时间复杂度

O(n)

参考代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> a(n, 0);
    while (m--) {
        int c;
        cin >> c;
        a[--c]++;
    }
    cout << *min_element(a.begin(), a.end()) << endl;
    return 0;
}

丰收

思路

维护前缀和数组之后,二分查找答案。

时间复杂度

O(m*logn)

参考代码

#include <bits/stdc++.h>

using namespace std;

int sum[100005];

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        int a;
        scanf("%d", &a);
        sum[i] = sum[i - 1] + a;
    }
    int q;
    scanf("%d", &q);
    while (q--) {
        int d;
        scanf("%d", &d);
        int pos = lower_bound(sum, sum + n + 1, d) - sum;
        printf("%d\n", pos);
    }
    return 0;
}

思路

贪心。每次从最高的塔拿一块放到最低的塔上。

讲道理的话应该spj吧。。。

时间复杂度

O(k*logn)

参考代码

#include <bits/stdc++.h>
using namespace std;
using LL = long long;

int main() {
    int n, k, m = 0;
    cin >> n >> k;
    set<pair<int, int> > s;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        s.emplace(x, i);
    }
    vector<pair<int, int> > v;
    while (k && s.size() > 1 && s.rbegin()->first - s.begin()->first > 1) {
        auto a = *s.begin(), b = *s.rbegin();
        s.erase(a), s.erase(b);
        k--;
        a.first++;
        b.first--;
        s.insert(a);
        s.insert(b);
        v.emplace_back(b.second, a.second);
    }
    cout << s.rbegin()->first - s.begin()->first << " " << v.size() << endl;
    for (auto p : v) cout << p.first << " " << p.second << endl;
    return 0;
}

瞌睡

思路

以长度为k的滑动窗口做个dp

时间复杂度

O(n)

参考代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
    vector<int> a(n), t(n);
    for (int i = 0; i < n; i++)
        cin >> a[i];
    int now = 0;
    for (int i = 0; i < n; i++)
        cin >> t[i], now += t[i] * a[i];
    int res = now;
    for (int i = 0; i < n;) {
        now += (!t[i]) * a[i];
        if (++i >= k) {
            res = max(res, now);
            now -= (!t[i - k]) * a[i - k];
        }
    }
    cout << res << endl;
    return 0;
}

整理房间

思路

暴力枚举每团杂物4 ^ 4次旋转

时间复杂度

O(256*n)

参考代码

#include <bits/stdc++.h>
using namespace std;

struct point {
    int x, y;
    point(int x = 0, int y = 0) : x(x), y(y) {}
    point operator+(const point &rhs) const {
        return point(x + rhs.x, y + rhs.y);
    }
    point operator-(const point &rhs) const {
        return point(x - rhs.x, y - rhs.y);
    }
    point rotate() { return point(-y, x); }
    point rotate(const point &o) const { return o + (*this - o).rotate(); }
    bool operator==(const point &rhs) const { return x == rhs.x && y == rhs.y; }
};

bool check(const point &a, const point &b) {
    if (a.x == 0 && a.y == 0 || b.x == 0 && b.y == 0) return false;
    if (a.x * a.x + a.y * a.y != b.x * b.x + b.y * b.y) return false;
    if (a.x * b.x + a.y * b.y != 0) return false;
    return true;
}

int main() {
    int n;
    cin >> n;
    while (n--) {
        point p[4], o[4], a[4];
        for (int i = 0; i < 4; i++)
            scanf("%d %d %d %d", &p[i].x, &p[i].y, &o[i].x, &o[i].y);
        int res = -1;
        int x, y, z, w;
        for (x = 0, a[0] = p[0]; x < 4; x++) {
            for (y = 0, a[1] = p[1]; y < 4; y++) {
                for (z = 0, a[2] = p[2]; z < 4; z++) {
                    for (w = 0, a[3] = p[3]; w < 4; w++) {
                        int cost = x + y + z + w;
                        if (a[0] + a[1] == a[2] + a[3] &&
                                check(a[0] - a[1], a[2] - a[3]) ||
                            a[0] + a[2] == a[1] + a[3] &&
                                check(a[0] - a[2], a[1] - a[3]) ||
                            a[0] + a[3] == a[1] + a[2] &&
                                check(a[0] - a[3], a[1] - a[2])) {
                            if (res == -1 || res > cost) res = cost;
                        }
                        a[3] = a[3].rotate(o[3]);
                    }
                    a[2] = a[2].rotate(o[2]);
                }
                a[1] = a[1].rotate(o[1]);
            }
            a[0] = a[0].rotate(o[0]);
        }
        printf("%d\n", res);
    }
    return 0;
}

小易的字典

思路

贪心。从前往后,对于当前位置是'a'还是'z'可以计算出来。

还是有其他高级一点的做法的(雾

时间复杂度

O(n^2)

参考代码

#include <bits/stdc++.h>

using namespace std; 

int check(int a, int b, long long lim){ 
    long long ret = 1;
    if(b * 2 > a) b = a - b; 
    for(int i = 0; i < b; i++) { 
        ret *= (a - i);
        ret /= (i + 1);
        if(ret >= lim) return -1; 
    } 
    if(ret >= lim) return -1; 
    return (int)ret; 
} 
string solve(int a, int z, int k){ 
    string out = "";
    int n = a + z, i, s; 
    s = check(a + z, a, (long long)k);
    if(s != -1) return out; 
    for(int i = 0; i < n; i++){ 
        if(a == 0 || z == 0) break; 
        s = check(a - 1 + z, a - 1, (long long)k); 
        if(s == -1){ 
            out += 'a';
            a--; 
        } else { 
            k -= s;
            out += 'z';
            z--; 
        } 
    } 
    for(int i = 0; i < a; i++) out += 'a';
    for(int i = 0; i < z; i++) out += 'z'; 
    return out; 
} 
int main() {
    int n, m, k;
    cin >> n >> m >> k;
    string ans = solve(n, m, k);
    if(ans.size() == 0) cout << -1 << endl;
    else cout << ans << endl;
    return 0;
}
#网易##校招##笔试题目##题解#
全部评论
一首凉凉送给自己
点赞 回复 分享
发布于 2018-08-11 17:15
塔那一道题,这样解合理吗?你这样操作的话,很容易出现最后几次挪动并不会降低最高塔与最小塔之间的差值,比如 塔的高度是 3,3,3,4,4,4,5,5,5;k=2,挪动前是2 ,按照你的解法 挪动后是44344445,这样差值并没有小呀。
点赞 回复 分享
发布于 2018-08-11 17:42
膜拜大佬,塔那道题思路是一样的,本地测试可以通过,但是线上直接0%,gg凉凉
点赞 回复 分享
发布于 2018-08-11 17:19
给楼主征集男朋友
点赞 回复 分享
发布于 2018-08-11 17:21
这代码应该不是一个人写的,不同题的代码风格差别有点大。
点赞 回复 分享
发布于 2018-08-11 20:51
第一题苹果堆,第二题塔,第三题拼正方形。一直卡在塔那,换了两种输出顺序,一直20%,心态崩了,还是太菜
点赞 回复 分享
发布于 2018-08-11 17:27
塔那题一直20%,看了n遍题目。。赛后想到没有考虑到两座小塔合并成一座大塔,结果原来还是贪心,只是没有判spj?那不是神坑么😂
点赞 回复 分享
发布于 2018-08-11 17:48
看来大部分人都是制作出来一个啊
点赞 回复 分享
发布于 2018-08-11 17:35
调了40+min的塔,思路一模一样。。。一直20%。。。。
点赞 回复 分享
发布于 2018-08-11 17:31
塔那题。。。思路很简单,为啥一直20% 搞不懂。
点赞 回复 分享
发布于 2018-08-11 17:23
塔那一题 有没有谁能解答一下为什么通过为0……本地一点问题没有啊 思路也是最高的移动到最低的。 #include <stdio.h> int main() { int n, k, i, j, s, m, minIndex, maxIndex, minHeight, maxHeight; int arr[100]; int opArr[2000]; while(scanf("%d %d", &n, &k) != EOF) { int l = 0; for (i = 0; i < n; i++) { scanf("%d", &arr[i]); } for (i = 0; i < k; i++) { minIndex = 0; minHeight = arr[0]; maxIndex = 0; maxHeight = arr[0]; for (j = 0; j < n; j++) { if (arr[j] > maxHeight) { maxHeight = arr[j]; maxIndex = j; } if (arr[j] < minHeight) { minHeight = arr[j]; minIndex = j; } } if (maxHeight - minHeight < 2) { break; } else { arr[maxIndex] -= 1; arr[minIndex] += 1; maxHeight -= 1; minHeight += 1; opArr[l] = maxIndex + 1; opArr[l+1] = minIndex + 1; l += 2; } } s = maxHeight - minHeight; m = i; printf("%d %d\n", s, m); l = 0; for (i = 0; i < m; i++) { printf("%d %d\n",opArr[l], opArr[l+1]); l += 2; } } return 0; }
点赞 回复 分享
发布于 2018-08-11 17:21
有赞前端招聘,无HC限制,简历至:ronghang@youzan.com
点赞 回复 分享
发布于 2018-08-15 10:47
看了答案觉得还是整理房间最难,塔的那题数据坑
点赞 回复 分享
发布于 2018-08-12 17:49
大佬你的代码中有的用到了using LL = long long;但是后面又没有用到LL,请问这句话有什么用么?🙏最近被输入输出折磨了
点赞 回复 分享
发布于 2018-08-12 16:21
彻底凉了╮(╯_╰)╭
点赞 回复 分享
发布于 2018-08-12 11:27
丰收那题有问题吧,并没有说明越级的时候输出要求。我一直都是90% 我对于输入0的输出是1,对于超过最大值的输出是最后一个的位置+1。 私以为跟表达的思路没有区别,请大佬帮我看看、谢谢! https://paste.ubuntu.com/p/Mn4P22x9SZ/ 比如这个样例的处理。 5 2 7 3 4 9 3 0 25 26 1 5 6
点赞 回复 分享
发布于 2018-08-12 09:20
俄罗斯方块那题是古老游戏么?我怎么感觉有问题,输出永远是得分最低的,还是我审错题了?
点赞 回复 分享
发布于 2018-08-11 23:44
给大佬点赞!
点赞 回复 分享
发布于 2018-08-11 21:22
擦,还真是暴力枚举
点赞 回复 分享
发布于 2018-08-11 21:15
为什么别人这么优秀
点赞 回复 分享
发布于 2018-08-11 21:02

相关推荐

鸿雁于飞:1. 求职定位乱成一锅粥,直接劝退HR 你期望职位同时写了「项目经理/技术经理/交付经理」,这仨岗根本不是一个赛道!项目经理玩流程和干系人,技术经理玩架构和带技术团队,交付经理玩客户和回款,你仨全堆上,HR直接判定「这人自己都不知道自己要干啥,没核心竞争力」,直接扔简历。 ​ 2. 2年多的职业空窗期,一个字不提,纯纯自杀行为 金融行业最看重职业连贯性和背景干净,你2018年5月到2020年8月,整整2年3个月没上班,啥说明都没有!HR直接脑补你是不是有竞业限制、是不是创业失败、是不是有啥背调过不了的问题,直接不敢往下看,首轮就给你筛了,这是最致命的坑! ​ 3. 工作经历纯纯摆烂,干货全藏起来了 你每段工作就写个公司、职位、时间,干了啥、带了多大团队、出了啥核心成果、给公司赚了/省了多少钱,一个字没有,全堆到后面的项目里了。HR看简历就3秒,第一眼看不到你每段工作的价值,直接就划走了,根本不会翻你后面的项目。 ​ 4. 项目经验像个大杂烩,还全是bug 你堆了快10个项目,银行、证券、公安、政务、日本项目啥都有,跟个杂货铺一样,HR根本看不到你的核心优势在哪。而且项目连个起止时间都不写,谁知道你这是最近的标杆项目,还是10年前刚入行干的活?还有数据前后矛盾,一会说「零事故交付」,一会说「生产事故率降低50%」,HR一看就觉得你瞎包装,根本不信。 ​ 5. 15年经验的经理岗,还在写一线拧螺丝的活,层级完全错配 你都应聘经理级岗位了,简历里还在写自己写接口、写测试脚本、做前端开发这些一线执行的活,完全没写你怎么搭建管理体系、怎么带团队、怎么搞定甲方、怎么控项目风险、怎么拿经营结果,MBA的价值一点没体现出来。HR看完直接觉得:合着你干了15年,还是个高级开发,根本达不到经理岗的要求,直接pass。 ​ 6. AI风口完全没抓住,写了句空话等于没写 现在全行业都在卷AI+金融,人家招管理岗,都要能落地AI场景的人。你就写了句「深化Transformer与大模型底层技术研习」,纯纯空话,一点实际落地成果都没有,跟其他候选人比,完全没差异化优势,人家凭啥放着年轻能落地的不要,要你这个只学了理论的? 姐好好看看,然后改改简历吧,要专,要精,然后降低求职目标。希望你能早日拿到offer
点赞 评论 收藏
分享
04-12 21:52
南开大学 Java
鼠鼠有点摆,去年边学着没敢投简历,没实习。从1月到现在总共面了五次,四次字节的日常(HR打电话约面试才敢去的),然后一次腾讯的暑期,都是一面挂,其他则是没给面。暑期的岗,4.2才开始海投,前面想着等字节第四次一面后再投,结果挂,而且感觉投晚了。字节投了11个,9个简历挂,剩下2个没动静。阿里全都简历挂,剩下的在&quot;投递简历&quot;。腾讯给了一次面。然后其他大中厂、手机厂什么的都是做完测评or笔试就没下文,打开几个看也是终止流程,感觉剩下的也应该是简历挂了。感觉是简历的原因?项目部分,几次面试,感觉面试官主要就拷问过秒杀这一个点。自己说的时候会尝试把sse那条说成亮点,但除了腾讯面试官问过一下这整个点在业务方面对用户有什么用之类的问题外,其他最多只是问一下sse八股...感觉也许不是很让面试官感兴趣。这个短链接也是无人问津,就被问过一回雪花算法的设计。也许我该拿点评改改,然后再在网上找一个什么项目,凑两个,而不是用自己现在这两个项目?或者是点评改改放前面,然后原本第一个项目,把秒杀抽掉,剩下的想办法从网上火的RAG项目里移植点亮点,或者直接就用网上的RAG项目?感觉我主要还是偏向后端开发,但是感觉如果除开点评,再拿一个项目,想不到有什么自己能掌控且跟点评不重的。然后鼠鼠之前主要的问题是担心面试让打开项目演示,然后就一直花时间在用AI整第一个项目,第二个项目都没时间整,第四次面试之前还因为太害怕被认为不熟悉项目,跟AI一起把简历的说辞做了大幅度弱化,然后暑期都是拿弱化后的简历投的,感觉是不是看上去太没有吸引力就直接给简历挂了。(图1是弱化后的,图2是弱化前的,但之前3月初投了几家好像也是简历挂。)而且因为3月花了很多时间整在跟AI整代码,导致八股和算法都没怎么看,算法之前有跟灵神题单刷一些,还算入门,但是八股只看了一些基本的,可能面试的时候只答得上来60-70%,而且表述有些混乱,都是想到哪说到哪;前面几回面试基本上都有大板块的基础八股没答出来,比如RedisZ&nbsp;Set数据结构,MQ延时消息、可靠性保证,JVM内存分配的过程、GC&nbsp;roots,JUC锁,设计模式。现在有点不知道该怎么办。求大佬们给点简历修改建议或者面试准备建议,不胜感激!
何时能不做牛马:简历每个点之间的间距可以缩一下。几乎没遇到过要演示项目的情况,即使万一遇上了你也可以说部署在其他电脑上本地没代码。nku不应该简历挂吧?抓紧背背八股练练表达,不要放弃,五六月份找到也不晚(不然还得提前入职
应届生简历当中,HR最关...
点赞 评论 收藏
分享
评论
点赞
226
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务