深信服2018春招笔试题解

原文链接:点这儿

深信服还是一如既往的“懒”,2018秋招的5个编程题在本次春招出现了三道,然后添加了一道新的编程题,且选择题和填空题基本与秋招的雷同,看来之前没看深信服2018校园招聘C++工程师编程题 - 题解的同学有点亏啊。我猜深信服明年的编程题估计还是这样,不看亏的是自己(瞎吹一波)。

这次题解只给出新添加的那道编程题的解析与代码,同时修正深信服2018校园招聘C++工程师编程题 - 题解中第五题:围棋的气的代码(理解错题意了),四道编程题全部通过。

第一题:

详情见深信服2018校园招聘C++工程师编程题 - 题解中的第三题。

第二题:

详情见深信服2018校园招聘C++工程师编程题 - 题解中的第四题。

第三题:

先可以看下深信服2018校园招聘C++工程师编程题 - 题解中的第五题围棋真正的气该如何求;

其次,这道题简化了围棋的气,之前理解错题目了,以为棋子遇到与它一样的棋子就不能走了,其实不然,棋子遇到与自己相同的棋子一样可以继续前进,只不过对结果没有贡献而已

因此,这里用$bfs$就可以解决问题了。

代码:

int calc(struct weiqi *wq, int y, int x)
{
    //TODO:
    if (wq->board[x][y] == NONE)
        return -1;
    const int MAXSIZE = 100000;
    const int n = 19;
    const int dirx[] = {0, 0, 1, -1};
    const int diry[] = {1, -1, 0, 0};
    const int theChess = wq->board[x][y] == 1 ? 2 : 1;
    int que[MAXSIZE];
    int head = 0, tail = 0;
    int used[n * n];
    memset(used, 0, sizeof(used));
    que[tail++] = x * n + y;
    tail %= MAXSIZE;
    used[x * n + y] = 1;
    int ret = 0;
    while (head < tail) {
        int node = que[head++];
        head %= MAXSIZE;
        int nowx = node / n;
        int nowy = node % n;

        for (int i = 0; i < 4; i++) {
            int tx = nowx + dirx[i];
            int ty = nowy + diry[i];
            if (tx >= 0 && tx < 19 && ty >= 0 && ty < 19 && !used[tx * n + ty] && wq->board[tx][ty] != theChess) {
                if (wq->board[tx][ty] == NONE)
                    ++ret;
                used[tx * n + ty] = 1;
                que[tail++] = tx * n + ty;
                tail %= MAXSIZE;
            }
        }
    }
    return ret;
}

第四题:

题目:

已知某一个序列,把序列中的字母按出现顺序压入一个栈,在入栈的任意过程中,允许栈中的字母出栈,求所有可能的出栈顺序。

样例输入:

<pre>
abc
</pre>

样例输出:

<pre>
abc
acb
bac
bca
cba
</pre>

解析:

所有合法的出栈序列的个数是一个卡特兰数,因此,给出的序列长度不可能很大,故直接用递归模拟这个过程;

遍历序列中的每一个字母,先把当前字母入栈,这个时候,栈中肯定有字母,你可以选择继续遍历序列,也可以在这个时候把栈中的字母一个一个出栈,最后,遍历完序列后,再把栈中的所有字母顺序出栈,这样子就可以得到所有合法的序列;

注意,这样得出的序列会有重复,因此,用set去重,同时,观察样例,发现合法序列的以字典序输出,刚好set中的元素是有序的,牛客网没有$Special Judge$,如果不按字典序输出就通不过。

代码:

#include <bits/stdc++.h>

using namespace std;

void dfs(string &str, int i, string st, string tmp, set<string> &ret)
{
    if (i == (int)str.size()) {
        reverse(st.begin(), st.end());
        ret.insert(tmp.append(st));
        return ;
    }
    st.push_back(str[i]);
    dfs(str, i + 1, st, tmp, ret);
    for (; !st.empty(); ) {
        tmp.push_back(st.back());
        st.pop_back();
        dfs(str, i + 1, st, tmp, ret);
    }
}

int main()
{
    for (string str; cin >> str; ) {
        set<string> ret;
        dfs(str, 0, "", "", ret);
        for (auto it = ret.begin(); it != ret.end(); ++it)
            cout << *it << endl;
    }
    return 0;
}
#春招##深信服#
全部评论
这操作……,出些新题多好
点赞 回复 分享
发布于 2018-03-16 11:16
楼主不打无准备的战啊。。我帮你转给他们家HR
点赞 回复 分享
发布于 2018-03-15 21:09
我做的题好像跟你不一样,我第一题不是反序
点赞 回复 分享
发布于 2018-03-15 21:26
和我的卷子一样,不过我是第一次做,不是很喜欢给出代码框架,然后写函数的这种。只做出三道
点赞 回复 分享
发布于 2018-03-15 21:34
我记得去年秋招是五道题
点赞 回复 分享
发布于 2018-03-15 21:37
测试和研发的编程题一样吗?
点赞 回复 分享
发布于 2018-03-16 12:17
【求救】机器学习笔试题_技术交流_牛客网  https://www.nowcoder.com/discuss/87027
点赞 回复 分享
发布于 2018-07-19 14:07

相关推荐

把球:这个听过,你加了就会发现是字节的hr
点赞 评论 收藏
分享
评论
点赞
69
分享
正在热议
# 25届秋招总结 #
442405次浏览 4511人参与
# 春招别灰心,我们一人来一句鼓励 #
41942次浏览 531人参与
# 北方华创开奖 #
107430次浏览 599人参与
# 地方国企笔面经互助 #
7961次浏览 18人参与
# 同bg的你秋招战况如何? #
76670次浏览 561人参与
# 虾皮求职进展汇总 #
115613次浏览 886人参与
# 阿里云管培生offer #
120231次浏览 2219人参与
# 实习,投递多份简历没人回复怎么办 #
2454658次浏览 34857人参与
# 实习必须要去大厂吗? #
55771次浏览 961人参与
# 提前批简历挂麻了怎么办 #
149901次浏览 1977人参与
# 投递实习岗位前的准备 #
1195935次浏览 18548人参与
# 你投递的公司有几家约面了? #
33205次浏览 188人参与
# 双非本科求职如何逆袭 #
662208次浏览 7394人参与
# 如果公司给你放一天假,你会怎么度过? #
4753次浏览 55人参与
# 机械人春招想让哪家公司来捞你? #
157628次浏览 2267人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11561次浏览 287人参与
# 发工资后,你做的第一件事是什么 #
12704次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35804次浏览 384人参与
# 参加完秋招的机械人,还参加春招吗? #
20126次浏览 240人参与
# 我的上岸简历长这样 #
452016次浏览 8088人参与
# 实习想申请秋招offer,能不能argue薪资 #
39299次浏览 314人参与
# 非技术岗是怎么找实习的 #
155868次浏览 2120人参与
牛客网
牛客企业服务