腾讯音乐笔试ak代码

第一题卡了比较久,其实只要每次变成计数为双数的字母就好,因为aa和aaa都只需要一步就可以变成无重复
int minOperations(string str)
    {
        int cnt[300]={0};
        long long ans=0;
        for(auto &c:str)
        {
            cnt[c]++;
        }
        while(true)
        {
            int maxVal=INT_MIN, v=-1;
            for(int i='a';i<='z';i++)
            {
                if(maxVal<cnt[i])
                {
                    maxVal=cnt[i];
                    v=i;
                }
            }
            if(maxVal<=1)
                break;
            int u=-1;
            for(int i='a';i<='z';i++)
            {
                if(cnt[i]%2==0)
                {
                    u=i;
                    break;
                }
            }
            if(u==-1)
                u='a';
            cnt[v]-=2;
            cnt[u]++;
            ans++;
        }
        return ans;
    }

第二题先计算每个节点的高度(到叶节点的路径长度),每次只选高度较高的孩子遍历,因为左右孩子的权值和一定相等,所以树的权值和为较高的子树权值和*2+1
unordered_map<TreeNode*, int> levs;
    const int MOD=1e9+7;
    int getLev(TreeNode *root)
    {
        if(root==nullptr)
            return 0;
        if(!levs.count(root))
        {
            levs.insert(make_pair(root, 1+max(getLev(root->left), getLev(root->right))));
        }
        return levs[root];
    }
    int DFS(TreeNode *root)
    {
        if(!root->left && !root->right)
            return 1;
        int leftLev=levs[root->left], rightLev=levs[root->right];
        int maxChildSum=leftLev>rightLev?DFS(root->left):DFS(root->right);
        return (2*maxChildSum+1)%MOD;
    }
    int getTreeSum(TreeNode* tree)
    {
        getLev(tree);
        return DFS(tree);
    }

第三题会建树就可以写,枚举所有可能的情况,纯看代码功底了
vector<TreeNode*> createTree(vector<int>& preOrder, vector<int>& inOrder, int pl, int ph, int il, int ih)
    {
        if(pl>ph)
            return vector<TreeNode*>{nullptr};
        vector<TreeNode*> res;
        for(int idx=il;idx<=ih;idx++)
        {
            if(preOrder[pl]==inOrder[idx])
            {
                int leftNum=idx-il;
                auto leftChilds=createTree(preOrder, inOrder, pl+1, pl+leftNum,il,idx-1);
                auto rightChilds=createTree(preOrder, inOrder, pl+leftNum+1, ph,idx+1,ih);
                for(auto &leftChild:leftChilds)
                {
                    for(auto &rightChild:rightChilds)
                    {
                        auto p=new TreeNode(preOrder[pl]);
                        p->left=leftChild;
                        p->right=rightChild;
                        res.push_back(p);
                    }
                }
            }
        }
        return res;
    }
    vector<TreeNode*> getBinaryTrees(vector<int>& preOrder, vector<int>& inOrder)
    {
        int n=preOrder.size();
        return createTree(preOrder, inOrder, 0, n-1, 0, n-1);
    }



#腾讯音乐娱乐笔试##腾讯音乐2023秋招笔试心得体会#
全部评论
最后一题思路跟你一样,用例也过了,run出来0,不知道为啥
2 回复 分享
发布于 2022-09-08 20:47 四川
大佬牛逼
点赞 回复 分享
发布于 2022-09-08 20:48 吉林
大佬牛逼
点赞 回复 分享
发布于 2022-09-08 20:50 湖北
思路都一样,2,3题代码都基本一样,但是每道题都没a,可能细节上有小错误,状态太差了
点赞 回复 分享
发布于 2022-09-08 20:54 河南
我建树那题这样写的为啥20啊
点赞 回复 分享
发布于 2022-09-08 20:55 广东
大佬牛逼
点赞 回复 分享
发布于 2022-09-08 20:59 辽宁
woc 你的第二题这么优雅吗 我后序遍历的 没便利明白
点赞 回复 分享
发布于 2022-09-08 21:05 广东
第二题有其他解法: const int max_int = 1e9 + 7; int getTreeSum(TreeNode *root) {      return func(root) % max_int;  }  long long func(TreeNode *root) {       if (!root->left)           return 1;       long long left = func(root->left);       long long right = func(root->right);       return (2 * max(left,right) + 1);  }
点赞 回复 分享
发布于 2022-09-08 21:18 上海
《大淘宝技术-用户产品技术-交易》核心团队校招启动!HC多多,TL直连,提供简历修改,有答疑群。核心,速来!
点赞 回复 分享
发布于 2022-09-09 10:54 浙江
用例在哪哦
点赞 回复 分享
发布于 2022-09-14 22:53 重庆

相关推荐

10-17 10:05
已编辑
北华大学 全栈开发
牛客872465272号:掉头发了哥
点赞 评论 收藏
分享
昨天 11:21
门头沟学院 Java
总包48.5w,意想不到的价格
无情咸鱼王的秋招日记之薛定谔的Offer:R
点赞 评论 收藏
分享
评论
24
35
分享
牛客网
牛客企业服务