腾讯音乐笔试

第一题:字符串
给定一个只包含小写字母字符串,每次可以选择两个相同的字符删除,并在字符串结尾新增任意一个小写字母。
请问最少多少次操作后,所有的字母都不相同?

字符串长度<1e3

input:
abab

output:
2

第一次把2个a变成f,第二次把2个b变成b。得到fb,每个字母都不相同,最少操作次数为2。

public static int minOperations (String str) {
    int[] nums = new int[26];
    for (int i = 0; i < str.length(); i++) {
        nums[str.charAt(i) - 'a']++;
    }
    int cnt = 0, kinds = 0;
    for (int i = 0; i < 26; i++) {
        cnt += nums[i] / 2;
        kinds += nums[i] % 2;
    }
    if (cnt + kinds <= 26) {
        return cnt;
    } else {
        int a = 26 - kinds;
        return 2 * cnt  - a;
    }
}
第二题:
题目描述
已知一个二叉树的先序遍历序列和中序遍历序列,但其中一些节点的值可能相同。
请你返回所有满足条件的二叉树。二叉树在数组中的顺序是任意的。

input:
[1,1,2],[1,2,1]

output:
[{1,1,#,#,2},{1,#,1,2}]

public ArrayList<TreeNode> getBinaryTrees (ArrayList<Integer> preOrder, ArrayList<Integer> inOrder) {
    ArrayList<TreeNode> temp = dfs(preOrder, inOrder);
    System.out.println(temp.size());
    return temp;
}

public ArrayList<TreeNode> dfs(ArrayList<Integer> preOrder, ArrayList<Integer> inOrder) {
    ArrayList<TreeNode> ans = new ArrayList<>();
    if (inOrder.size() == 0) {
        return ans;
    }
    int rootVal = preOrder.get(0);
    for (int i = 0; i < inOrder.size(); i++) {
        int k = inOrder.get(i);
        if (rootVal == k) {
            ArrayList<Integer> inOrderLeft = new ArrayList<>();
            ArrayList<Integer> inOrderRight = new ArrayList<>();
            ArrayList<Integer> preOrderLeft = new ArrayList<>();
            ArrayList<Integer> preOrderRight = new ArrayList<>();
            if (i > 0) {
                int sum = 0;
                for (int z = 0; z < i; z++) {
                    inOrderLeft.add(inOrder.get(z));
                    sum += inOrder.get(z);
                }
                for (int z = 1; z <= i; z++) {
                    preOrderLeft.add(preOrder.get(z));
                    sum -= preOrder.get(z);
                }
                if (sum != 0) {
                    continue;
                }
            }
            if (i < inOrder.size()) {
                for (int z = i + 1; z < inOrder.size(); z++) {
                    inOrderRight.add(inOrder.get(z));
                    preOrderRight.add(preOrder.get(z));
                }
            }
            List<TreeNode> left = dfs(preOrderLeft, inOrderLeft);
            List<TreeNode> right = dfs(preOrderRight, inOrderRight);
            if (left.size() > 0 && right.size() > 0) {
                for (TreeNode l : left) {
                    for (TreeNode r : right) {
                        TreeNode root = new TreeNode(rootVal);
                        root.left = l;
                        root.right = r;
                        ans.add(root);
                    }
                }
            } else if (left.size() > 0) {
                for (TreeNode l : left) {
                    TreeNode root = new TreeNode(rootVal);
                    root.left = l;
                    ans.add(root);
                }
            } else if (right.size() > 0) {
                for (TreeNode r : right) {
                    TreeNode root = new TreeNode(rootVal);
                    root.right = r;
                    ans.add(root);
                }
            } else {
                TreeNode root = new TreeNode(rootVal);
                ans.add(root);
            }

        }
    }
    return ans;
}

第三题:不会


#腾讯音乐娱乐笔试##腾讯音乐2023秋招笔试心得体会#
全部评论
第二题没看懂大大的思路
点赞 回复
分享
发布于 2022-09-09 00:55 广东
求文字思路
2 回复
分享
发布于 2022-09-09 05:40 江苏
滴滴
校招火热招聘中
官网直投
我超校友,加个v?
点赞 回复
分享
发布于 2022-09-09 08:14 广东
第三题是递归,递归函数的输入是根节点,递归的返回值是当前节点的左右子树权值和: left1 = dfs(root.left) right1 = dfs(root.right) 如果left1更大,那么root.left.val=1,root.right.val=(left1+1-right1) 如果right1更大,那么root.right.val=1,root.left.val=(right1+1-left1) 如果两者相等,那么root.right.val=1,root.left.val=1 递归返回return root.left.val+left1+root.right.val+right1 最终返回 (dfs(root)+1)%(10**9+7)
点赞 回复
分享
发布于 2022-09-09 10:41 甘肃
有进面了吗
点赞 回复
分享
发布于 2022-09-23 22:41 广东
面试了么老哥
点赞 回复
分享
发布于 2022-09-26 13:12 辽宁

相关推荐

5 19 评论
分享
牛客网
牛客企业服务