字节跳动技术训练营—后端开发专场 机试题解

Posted 沉迷单车的追风少年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节跳动技术训练营—后端开发专场 机试题解相关的知识,希望对你有一定的参考价值。

 

目录

1、扑克牌重新洗牌

2、二叉树的路径总和

3、剧本杀


但是由于牛客的笔试环境不能截图,离开三次就算作弊,所以我只能靠回忆写一写题目。

1、扑克牌重新洗牌

大概意思是说有一副扑克牌,需要重新洗牌。

黑桃、红桃、方块、梅花。

分别代表不同的数组,例如黑桃是1、2、3、4……13;红桃是21、22、23……

但是洗牌的时候不能打乱原本牌组内部的顺序。也就是只是将黑桃、红桃、方块、梅花四组按顺序排好,但是内部的顺序不管。

这题很简单,暴力一下直接一个sort都能通过40%。

因为只有四组,我们写出四个循环依次判断就能顺利AC,而且算法复杂度还是O(N)。就是代码有点丑陋。

也就是说,第一次遍历,把黑桃的按顺序挑出来放好;第二次遍历把红桃挑出来放好;第三次遍历把方块挑出来放好;第四次遍历把梅花挑出来放好。

2、二叉树的目标总和

基本上是LeetCode的原题:

但是平台是有bug,比如:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:[[5,4,11,2],[5,8,4,5]]

这个样例输出的是

[[5,8,4,5],[5,4,11,2]]

也就是说顺序发生了改变,直接判为错误,非常坑爹。

AC代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
private:
    vector<vector<int>> v;
public:
    vector<vector<int>> pathSum(TreeNode* root, int sum) {
        vector<int> a;
        pathSum(root,sum,a);
        return v;
    }
    void pathSum(TreeNode* root,int sum,vector<int> a){
        if(root==NULL)
            return;
        a.push_back(root->val);
        //在倒数第二层进行判断,如果能满足目标条件
        if(sum==root->val&&!root->left&&!root->right){
            v.push_back(a);
            return;
        }
        pathSum(root->left,sum-root->val,a);
        pathSum(root->right,sum-root->val,a);
    }
};

3、剧本杀

没玩过剧本杀的朋友(比如我),心里一万匹。。。

背景啰嗦了一堆话,暂且不管。

核心任务就是将一个字符串打乱顺序,不能让同样的字符串连在一起。

例如:

input:aab

output:aba

input:abbc

output:abcb

这题我用了双指针,如果遇到相同的就排除另外一个指针去找不同,找到就相互交换。

int main() {

    while (cin >> s) {
        if (s.size() <= 2) {
            cout << s << endl;
        }
        for (int i = 1; i < s.size(); i++) {
            if (s[i] == s[i - 1]) {
                int j = i;
                while (j < size() && s[j] == s[i]) {
                    j++;
                }
                int temp = s[i];
                s[i] = s[j];
                s[j] = temp;
            }
        }
        cout << s << endl;
    }
    return 0;
}

前面的题目都是核心代码格式,这一题突然变成了ACM格式。。。

没有AC,只能过一半,可能是剧本杀的题目没理解清楚,再见。

以上是关于字节跳动技术训练营—后端开发专场 机试题解的主要内容,如果未能解决你的问题,请参考以下文章

杭州 | 字节跳动后端开发工程师火热申请中

字节跳动笔试题:链表反转

2019 字节跳动java面试笔试题 (含面试题解析)

"字节跳动杯"2018中国大学生程序设计竞赛-女生专场 Solution

字节跳动青训营笔试题解

字节跳动青训营笔试题解