腾讯音乐笔试4/13(Java版)

刚刚根据牛客两位大佬的思路,进行的复盘,现在进行写一下我的思路,以及学习到的知识,供大家参考。

先说一下自己当时写的过程,第一题暴力直接0%,第二题理解题目花了半个小时,最后还是只过了5%,最后一题打卡题。

/*
    小红定义一个数组为“好数组”,当且仅当该数组满足以下条件:
        1.数组仅由0.1,2三种元素组成。
        2.数组相邻的元素不相等。例如:[2.1,2,0.1]是好数组。
    小红定义一个数组的“陡峭值”为该数组相邻元素的差的绝对值之和。
        例如,[2,1.2,0,1]的陡峭值为|2-1|+|1-2|+|2-0|+|0-1|=5。
    小红想知道,长度为n的所有好数组的陡峭值之和是多少?由于答案过大,请对10^9+7取模。
    数据范围:2<n<10^9
    示例:
        输入:2 输出:8
        说明:共有[0,1],[1,0],[0,2],[2,0],[1,2],[2,1]这六个好数组。陡模值之和为1+1+2+2+1+1=8。
*/
//思路:观察法(虽然很扯,确实是这样) 递推式: (n-1)*2^(n+1) {n>=2} 再通过快速幂求解(类型为 long)
//注意:int类型最大值约等于 5*10^9  注意base,power也要用 long类型
public class test01 {
    public static final int Mod = (int)Math.pow(10,9)+7;
    //base 底数,power 指数
    public long doGet(long base,long power){
        long result = 1;
        while (power > 0) {
            if (power % 2 == 0) {
                //如果指数为偶数
                power = power / 2;//把指数缩小为一半
                base = base * base % Mod;//底数变大成原来的平方
            } else {
                //如果指数为奇数
                power = power - 1;//把指数减去1,使其变成一个偶数
                result = result * base % Mod;//此时记得要把指数为奇数时分离出来的底数的一次方收集好
                power = power / 2;//此时指数为偶数,可以继续执行操作
                base = base * base % Mod;
            }
        }
        return result;
    }
    public int fun(int n){
        long res = doGet(2,n+1);
        return (int)((n-1)*res%Mod);
    }
    public static void main(String[] args) {
        test01 t = new test01();
        System.out.println(t.fun(1000000000));
    }
}
/*
    什么是快速幂: 快速幂就是用来解决快速 求大幂的解法 比如:2^1000000000000
    公式:(A*B)%C = (A%C*B%C)%C (加法和加法同样适用)
    关键点: 我们平常求幂都是通过 将A循环n次,这样效率太低,我们可以用二分的思想 如:3^10 = (3*3)^5
    例子 :  3^10 = (3*3)^5   5无法平分 将其拆分成 4+1  原式= (3*3)^4 * (3*3)
           原式=(9*9)^2 * 9 = (81*81) * 9 = 6561 * 9
           关键: 最后求出的幂结果实际上就是在变化过程中所有当指数为奇数时底数的乘积
 */
/*
    大致意思:给你一棵树,树上有权值。让你把每一个结点子树的乘积末尾0的个数作为其价值
            然后将每一个结点最后权值改为价值
    如:[2,5,10,#,#,4,5] ->[3,0,2,#,#,0,0]
 */
//关键点:(1) 一个树的子树包括本身  (2) 统计子树中2和5的个数
/*
    详细思路:主要是 要将乘法运算转换成加法运算,因为10肯定是2*5得来的统计一共有多少个2和5
    然后通过后序遍历得到结果
 */
public class test02 {
    public TreeNode valueOfTree(TreeNode root) {
        dfs(root);
        return root;
    }
    private int[] dfs(TreeNode node) {
        if (node == null) {
            return new int[]{0,0};
        }
        int[] l = dfs(node.left);
        int[] r = dfs(node.right);
        int[] cur = cal(node.val);
        int n2 = cur[0] + l[0] + r[0];
        int n5 = cur[1] + l[1] + r[1];
        node.val = Math.min(n2, n5);
        return new int[]{n2,n5};
    }
    //末尾0的数量与因子2和5的数量关系
    private int[] cal(int num) {
        int n2 = 0, n5 = 0;
        while (num % 2 == 0) {
            num /= 2;
            n2 += 1;
        }
        while (num % 5 == 0) {
            num /= 5;
            n5 += 1;
        }
        return new int[]{n2,n5};
    }
}

总的来说,知道思路还是很简单的,很可惜当时没想出来。我太菜了。

#腾讯音乐实习##笔试##24届毕业生找实习#
全部评论
暑期实习?
1 回复 分享
发布于 2023-04-16 16:08 北京
第一题我直接回溯,求出所有的好数组,最后忘记改测试n的值了,只剩几分钟,导致a 0%
1 回复 分享
发布于 2023-04-16 16:06 广东

相关推荐

来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-21 11:33
昨天是学校最后一场招聘会,鼠鼠去参加了,全场只有一个招聘java的岗位,上来先做一份笔试题,做完后他拿张纸对答案,然后开始问简历上的问题,深圳小厂,6-8k(题目如下),后面还有两轮面试。然后我就在招聘现场逛呀逛,看到有公司招聘电商运营,给的比上年的小厂还多,鼠鼠就去了解了下,然后hr跟鼠鼠要了份简历,虽然我的简历上面全是求职Java开发相关的内容,但是hr还是鼓励我说没关系,她帮我把简历给老板看看,下周一会给我通知。招聘会结束后鼠鼠想了一段时间,也和朋友聊了聊,发现我可能是不太适合这个方向,然后就跟爸爸说回家了给我发条微信,我有些话想跟他说说。晚上爸爸到家了,跟我发了条微信,我立马跑出图书馆跟他打起了电话,这个通话长达一个小时,主要是跟爸爸坦白说我不想找这行了,是你的儿子太没用了,想试试其他行业。然后爸爸也跟我说了很多,说他从来没有希望我毕业后就赚大钱的想法,找不到就回家去,回家了再慢慢找,实在找不到就跟他干(帮别人装修房子,个体户),他也知道工作不好找,让我不要那么焦虑,然后就是聊一些家常琐事。对于后面的求职者呢我有点建议想提一下,就是如果招实习的时间或者秋招开始,而你的简历又很差的情况下,不要说等做好项目填充完简历之后再投,那样就太晚了,建议先把熟悉的项目写上简历,然后边投边面边完善,求职是一个人进步的过程,本来就比别人慢,等到一切都准备好后再投岂不是黄花菜都凉了。时间够的话还是建议敲一遍代码,因为那样能让你加深一下对项目的理解,上面那些说法只是针对时间不够的情况。当然,这些建议可能没啥用,因为我只是一个loser,这些全是建立在我理想的情况下,有没有用还需其他人现身说法。上篇帖子没想到学校被人认了出来,为了不丢脸只能匿名处理了。
KPLACE:找研发类或技术类,主要还是要1.多投 2.多做准备,很多方面都要做准备 3.要有心理准备,投累了就休息一两天,再继续,要相信自己能找到
投递58到家等公司7个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 11:45
你不要过来啊啊啊啊啊啊啊
码农索隆:对面:“今天你不面也得面”
点赞 评论 收藏
分享
评论
9
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务