腾讯音乐笔试——04.18

题目

  1. 对链表每两个元素之间插入0
  2. 构造一颗满二叉树,要求每层之和相等
  3. 给定个数字,各有红\白颜色标注,若为红色则该元素必选,否则可选。问有几种方案使得结果已选元素之和为偶数,对取模
  4. 给定01串,可操作k次使得元素置0,问最长的连续的1串的长度最短为多少?

题解

  1. 枚举即可

    public class Main {
        public ListNode insert0 (ListNode head) {
            ListNode curr = null, ans = null;
            while (head != null) {
                if (curr == null) {
                    ans = curr = new ListNode(head.val);
                } else {
                    curr = curr.next = new ListNode(head.val);
    
                }
    
                head = head.next;
                if (head != null) {
                    curr = curr.next = new ListNode(0);
                }
            }
            return ans;
        }
    }
    
  2. 直接dfs遍历建树,我的赋值策略是当前这层的前面的节点值是1,最后一个是余数,和为。当然也可以每个节点固定为。(这里和是还是都随意的,反正固定即可。)

    public class Main {
        public TreeNode create (int n) {
            return dfs(0, 1, n);
        }
    
        private TreeNode dfs(int dep, int idx, int tar) {
            TreeNode curr;
            if (idx == (1 << dep)) {// last one
                curr = new TreeNode((1 << (tar - 1)) - (idx - 1));
            } else {
                curr = new TreeNode(1);
            }
    
            if (dep + 1 != tar) {
                curr.left = dfs(dep + 1, idx * 2 - 1, tar);
                curr.right = dfs(dep + 1, idx * 2, tar);
            }
            return curr;
        }
    }
    
  3. dp

    dp[i][j]为前i个元素中,和为jj为0表示偶数,j为1表示奇数)的方案数。初始化dp[0][0] = 1,表示没有选择任何元素(和为0,即偶数)的方案数为1。

    然后,我们遍历每个元素。对于第i个元素,如果它的颜色是红色,那么我们必须选择它。如果元素的颜色是白色,那么我们可以选择也可以不选择它。

    • 当元素颜色为红色时:

    • 当元素颜色为白色时:

    最后的答案为dp[n][0]。(我这里滚动以优化内存和方便写,可以不滚。)

    public class Main {
        public int getMethod(ListNode head, String colors) {
            int idx = 0;
            long mod = (long) 1e9 + 7;
            long[][] dp = new long[2][2];// j的0是偶数,1是奇数
            dp[idx ^ 1][0] = 1;
    
            for (int i = 0; i < colors.length(); ++i, idx ^= 1, head = head.next) {
                dp[idx][0] = dp[idx][1] = 0;
                if (colors.charAt(i) == 'R') {
                    dp[idx][(0 + head.val) % 2] += dp[idx ^ 1][0];
                    dp[idx][(1 + head.val) % 2] += dp[idx ^ 1][1];
                } else {
                    dp[idx][0] += dp[idx ^ 1][0];
                    dp[idx][1] += dp[idx ^ 1][1];
                    dp[idx][(0 + head.val) % 2] += dp[idx ^ 1][0];
                    dp[idx][(1 + head.val) % 2] += dp[idx ^ 1][1];
                }
    
                dp[idx][0] = dp[idx][0] % mod;
                dp[idx][1] = dp[idx][1] % mod;
            }
            return (int) dp[idx ^ 1][0];
        }
    }
    
  4. 二分可行的长度,check就是遍历是否可行,若超了,则需要重新置0

    public class Main {
        public int maxLen(String s, int k) {
            int n = s.length();
            int l = -1, r = n + 1;
            while (l + 1 != r) {
                int mid = (l + r) / 2;
                if (check(s, mid, k)) r = mid;
                else l = mid;
            }
            return r;
        }
    
        private boolean check(String s, int len, int k) {
            for (int i = 0, j = 0; i < s.length(); ++i) {
                if (s.charAt(i) == '1') {
                    if (++j > len) {
                        if (--k < 0) return false;
                        j = 0;
                    }
                } else {
                    j = 0;
                }
    
            }
            return true;
        }
    }
    

彩蛋

恒生这场也打了,但是第一题暴力只过了80%,就没好意思贴出来,正解为dp,两维即可。因为*可以匹配多个相同字符,但是可能不匹配完,留几个给.来匹配。

比如:

下面是第二题,存每天的最小最大价钱即可,然后直接判。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        List<int[]> mn = new ArrayList<>();

        int n = in.nextInt();
        for (int i = 0; i < n; ++i) {
            int x = in.nextInt(), y = in.nextInt();
            if (mn.size() < x) mn.add(new int[]{y, y});
            else {
                mn.get(x - 1)[0] = Math.min(mn.get(x - 1)[0], y);
                mn.get(x - 1)[1] = Math.max(mn.get(x - 1)[1], y);
            }
        }

        for (int i = 0; i < mn.size(); i++) {
            System.out.print(i + 1 + " ");
            if (i < 2) System.out.println("N");
            else {
                if (Math.min(mn.get(i - 1)[0], mn.get(i - 2)[0]) + 5 <= mn.get(i)[1]) System.out.println("Y");
                else System.out.println("N");
            }
        }
    }
}
#题解##腾讯音乐##笔试##恒生#
全部评论
牛啊牛啊,我就做出1、2,第四题对了百分之30的用例,估计进不了面了
点赞
送花
回复
分享
发布于 04-18 22:37 浙江

相关推荐

压力最大的一集,面了一个半小时,写了四道题,以为挂了,过了一会看状态直接复试了说说你对于链表这种数据结构的理解react&nbsp;fiber中是怎么实现的链表和数组的区别,优势是什么深浅拷贝、堆栈,js数据类型,如何实现深浅拷贝手写深拷贝字符串为什么能调用某些方法,原理是什么(这里扯到了字符对象和原型链)一道输出题(考查作用域)手写事件冒泡和事件捕获阶段的一个点击事件弹窗事件捕获和事件冒泡顺序是怎么样的,谁先说说常见的排序算法(说了冒泡和快排)手写改编版delay函数手写flat方法DOM&nbsp;Ready的含义,如何计算这个时间onload和DOMContentLoaded的区别onload过程中,图片加载算在内吗FP,FCP,LCP是什么,如何获取Performance和PerformanceObserver的区别说说常用的Git指令git&nbsp;stash是干嘛的git&nbsp;merge&nbsp;和git&nbsp;rebase区别ansi字符是什么,和其他的编码有什么区别base64和ANSII的原理utf8和utf其他有什么区别,原理是什么utf8是怎么存储字符的,每个字符大小是多少,有什么优点知道哪些前端优化手段,你平时是怎么做的jpg&nbsp;png&nbsp;webp和avif有什么区别图片懒加载,骨架屏原理,白屏如何处理如何进行打包优化cdn是什么webpack和vite的区别vite的原理是什么没录音还有一些不记得了…题都写出来了,有几题没答好,结果秒过了tme带我走吧
腾讯音乐娱乐集团二面14人在聊 查看31道真题和解析
点赞 评论 收藏
转发
1.&nbsp;自我介绍2.&nbsp;我先跟你确定一下我们这边是客户端你没有问题吧?你是怎么想的?选安卓还是ios?3.&nbsp;缓存一致性如何解决?4.&nbsp;文件分片如何实现的?5.&nbsp;文件分片是串行上传还是并行上传?如果改成并行上传会有什么问题?如何解决?6.&nbsp;项目中多线程使用的场景是什么?7.&nbsp;线程池是如何配置的?8.&nbsp;多线程使用过程中有没有遇到死锁?9.&nbsp;死锁产生的原因以及解决方法是什么?10.&nbsp;项目中的难点是什么?11.&nbsp;项目中有什么功能是你现在觉得做的比较遗憾还有改进空间的?12.&nbsp;项目开发的流程是什么样的?13.&nbsp;平时是怎么学习新的技术的?14.&nbsp;能讲讲最近新学到的技术吗?15.&nbsp;Java四大引用以及使用场景了解吗?16.&nbsp;Java垃圾回收了解吗?17.&nbsp;Volitile关键字知道吗?防止指令重排的底层原理是什么?18.&nbsp;Hashmap的底层原理知道吗?扩容机制也讲一下呢?19.&nbsp;Java内存异常了解吗?如何排查?项目中有遇到内存泄露吗?20.&nbsp;TCP和UDP的区别?21.&nbsp;UDP如何实现可靠连接?22.&nbsp;粘包问题知道吗?TCP和UDP都会有粘包问题吗?23.&nbsp;算法:LRU缓存,反转链表2,接雨水反问1.&nbsp;业务是什么?2.&nbsp;如果能来实习的话有没有免费的QQ音乐会员?3.&nbsp;技术面是两轮还是三轮?本来做算法题,面试官给我发了个力扣链接,让我共享屏幕做,我点开一看lru缓存,做过了。面试官给我发了一个新的链接,反转链表2,也做过了,面试官说你这平时算法刷的挺多啊,我说要不你随便说道题我在本地idea写,面试官坚持用力扣链接,又发来一个,接雨水,也做过了,我尴尬一笑。面试官说那就不做了吧,说说思路吧。
查看23道真题和解析
点赞 评论 收藏
转发
4 12 评论
分享
牛客网
牛客企业服务