腾讯音乐 9.8笔试

第一题:去除重复字符的最小操作次数:
第二题:从有重复数字的前序和中序遍历序列构造所有可能的二叉树
第三题:新平衡二叉树的最小权值和

class Solution:
    def getMinCount(self, str: str) -> int:
        n = len(str)
        dic = collections.Counter(str)
        ans = 0
        # 记录去除原始字符串中的重复元素的操作次数
        for value in dic.values():
            ans += value // 2
        # 剩下的字符串如果超过26个字母,则每多一个就需要一次操作
        ans += max(0, n - ans - 26)
        return ans

    def getBinaryTrees(self , preOrder: List[int], inOrder: List[int]) -> List[TreeNode]:
        # write code here
        if not preOrder or not inOrder:
            return [None]
        ans = []
        for i in range(len(inOrder)):
            if inOrder[i] == preOrder[0]:
                # 所有的左右子树组合得到所有可能的树
                for left in self.getBinaryTrees(preOrder[1:i + 1], inOrder[:i]):
                    for right in self.getBinaryTrees(preOrder[i + 1:], inOrder[i + 1:]):
                        root = TreeNode(preOrder[0])
                        root.left = left
                        root.right = right
                        ans.append(root)
        return ans
    
    def getValueSum(self, tree: TreeNode) -> int:
        # 返回以node为根节点的新平衡数的最小权值和
        def dfs(node):
            if not node:
                return 0
            if not node.left and not node.right:
                self.ans += 1
                self.ans %= mod
                return 1
            left = dfs(node.left)
            right = dfs(node.right)
            # 如果不平衡,那么左右子树中权值较小的子树的权值需补充abs(left - right)
            # 每次总是假设该节点的权值为1,所以需加1
            self.ans += abs(left - right) + 1
            self.ans %= mod
            # 返回该节点的最小权值之和
            return left + right + abs(left - right) + 1

        mod = int(1e9 + 7)
        self.ans = 0
        dfs(tree)
        return self.ans


#腾讯音乐##腾讯音乐娱乐笔试##腾讯音乐2023秋招笔试心得体会#
全部评论
第三题计算层数然后计算2的层数次方再减一就ac了
点赞 回复 分享
发布于 2022-09-08 21:11 陕西
第三个一样的思路只能过55
点赞 回复 分享
发布于 2022-09-08 21:09 北京
public class Solution {     public int process(TreeNode root){         if(root == null){              return 0;         }         int left = process(root.left);         int right = process(root.right);         if(left == right){              root.val = left +right + 1;         }         else{              root.val = left > right ?  2*left +1:2*right + 1;         }         return root.val % (10^9 + 7);     } } 大佬帮我看下第三题这么写有什么问题,把左右节点的值累加到root的值上,感觉思路上没问题,但只A了10%
点赞 回复 分享
发布于 2022-09-08 21:13 北京
if not preOrder&nbs***bsp;not inOrder: 这一句没看懂
点赞 回复 分享
发布于 2022-09-08 21:27 广东
第三题题解: class Solution:     def getTreeSum(self, tree: TreeNode) -> int:         def height(root):             if root is None:                 return 0             return max(height(root.left), height(root.right)) + 1         return (2 ** height(tree) - 1) % 1000000007
点赞 回复 分享
发布于 2022-09-08 21:11 四川
前天刚做了一个用到counter的题,实在没想起来在哪个包
点赞 回复 分享
发布于 2022-09-08 21:13 广东
人傻了 ,把递归调用放for循环里当条件,楼主🐮
点赞 回复 分享
发布于 2022-09-08 21:48 广东
第一题太🐮了
点赞 回复 分享
发布于 2022-09-08 21:53 四川
牛皮
点赞 回复 分享
发布于 2022-09-08 22:48 陕西

相关推荐

头像
11-09 12:17
清华大学 C++
out11Man:小丑罢了,不用理会
点赞 评论 收藏
分享
11-15 18:39
已编辑
西安交通大学 Java
全村最靓的仔仔:卧槽,佬啥bg呢,本也是西交么
点赞 评论 收藏
分享
评论
8
29
分享
牛客网
牛客企业服务