字节跳动技术训练营—后端开发专场 机试题解
Posted 沉迷单车的追风少年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字节跳动技术训练营—后端开发专场 机试题解相关的知识,希望对你有一定的参考价值。
目录
但是由于牛客的笔试环境不能截图,离开三次就算作弊,所以我只能靠回忆写一写题目。
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,只能过一半,可能是剧本杀的题目没理解清楚,再见。
以上是关于字节跳动技术训练营—后端开发专场 机试题解的主要内容,如果未能解决你的问题,请参考以下文章