得物笔试AK

T1 100%

T2 100%

前两个都是模拟,没啥说的。

T3 100%

跳跃游戏,有n+1个点,从0跳到n。有四种跳跃方式(跳一格、两个、三个、四个),逐一选择,全都选完一遍后会刷新。跳跃点上有金币,不能让自己金币为负数。

常规DP解决。

        for(int i = 1; i <= n; i++) a[i] = in.nextLong();
        long[][] dp = new long[n+1][15];
        for(int i = 0; i <= n; i++) for(int j = 0; j < 15; j++) dp[i][j] = -1;
        dp[0][0] = 0;
        for(int i = 1; i <= n; i++){
            for(int j = 0; j < 15; j++){
                for(int l = 0; l < 4; l++){
                    if((j & (1 << l)) == 0){
                        // 0和15等价
                        int p = (j + (1 << l)) == 15 ? 0 : (j + (1 << l));
                        if(i - (l + 1) >= 0 && dp[i-(l+1)][p] != -1){
                            dp[i][j] = Math.max(dp[i][j], a[i] + dp[i-(l+1)][p]);
                        }
                    }
                }
            }
        }
        for(int i = 0; i < 15; i++) res = Math.max(res, dp[n][i]);
        System.out.println(res);

写的第一版代码不是DP,因为习惯DFS+cache的写法,但是下面代码好像有问题,从0位置开始,没法知道后续选择是否成立。还得从n开始,map里面放的是前面位置的元素(和dp一样)

    public long dfs(int ind, int p, long cur){
        if(ind == n) return 0;
        int key = ((ind << 10) | p);
        if(mp.containsKey(key)) return mp.get(key);
        long ans = -1;
        for(int i = 1; i <= 4; i++){
            if((p & (1 << i)) != 0 && (ind + i) <= n){
                int nind = ind + i;
                int np = (p - (1 << i)) == 0 ? 30 : (p - (1 << i));
                long ncur = cur + a[ind + i];
                // long cans = dfs(nind, np, ncur);
                if(dfs(nind, np, ncur) != -1){
                    ans = Math.max(ans, a[ind + i] + dfs(nind, np, ncur));
                }
            }
        }
        mp.put(key, ans);
        return ans;
    }

全部评论
得物一般笔完多久给面呀?请问
点赞 回复 分享
发布于 2025-04-19 21:50 湖南
ak 了也会被面试放鸽子
点赞 回复 分享
发布于 2025-04-10 15:31 广东
是后端吗,3月15号投的,给我转到数据分析岗了
点赞 回复 分享
发布于 2025-04-09 15:23 四川
woc 得物怎么没给我发笔试
点赞 回复 分享
发布于 2025-04-08 23:00 北京

相关推荐

03-20 10:04
湖南大学
一、Java基础1.&nbsp;HashMap底层原理数组+链表+红黑树,JDK1.8后引入红黑树。初始容量16,负载因子0.75,扩容为原来2倍。线程不安全,多线程推荐使用ConcurrentHashMap。2.&nbsp;ConcurrentHashMap&nbsp;1.7和1.8区别1.7:Segment分段锁+数组+链表,锁粒度较大。1.8:CAS+synchronized,数组+链表+红黑树,锁粒度更细,性能更高。3.&nbsp;ArrayList和LinkedList区别ArrayList:动态数组,查询快,增删慢。LinkedList:双向链表,查询慢,增删快。4.&nbsp;String、StringBuilder、StringBufferString不可变,线程安全。StringBuilder可变,非线程安全,效率最高。StringBuffer可变,线程安全,效率较低。二、并发编程5.&nbsp;synchronized底层实现修饰方法:ACC_SYNCHRONIZED标识。修饰代码块:monitorenter、monitorexit指令。锁升级流程:无锁→偏向锁→轻量级锁→重量级锁。6.&nbsp;ReentrantLock和synchronized区别ReentrantLock:手动加锁解锁,支持可中断、超时、公平锁。synchronized:自动加锁解锁,使用简单。7.&nbsp;线程生命周期新建、就绪、运行、阻塞、终止。8.&nbsp;死锁四个必要条件互斥、请求保持、不可剥夺、循环等待。破坏任一条件即可避免。三、JVM9.&nbsp;JVM内存模型堆、方法区、虚拟机栈、本地方法栈、程序计数器。10.&nbsp;垃圾回收机制对象存活判断:引用计数法、可达性分析法。回收算法:标记清除、标记复制、标记整理。11.&nbsp;常见垃圾收集器Serial、ParNew、Parallel&nbsp;Scavenge、CMS、G1。四、计算机基础12.&nbsp;TCP三次握手、四次挥手三次握手:建立可靠连接。四次挥手:断开连接,保证数据传输完成。13.&nbsp;HTTP和HTTPS区别HTTP明文传输,端口80。HTTPS加密传输,端口443,基于SSL/TLS。14.&nbsp;MySQL索引底层B+树,分为聚簇索引和非聚簇索引。遵循最左匹配原则,避免索引失效。15.&nbsp;MySQL事务ACID原子性、一致性、隔离性、持久性。五、项目与场景16.&nbsp;接口限流方案计数器、漏桶算法、令牌桶算法。17.&nbsp;分布式锁实现Redis分布式锁、Zookeeper分布式锁。18.&nbsp;Redis缓存问题缓存穿透:布隆过滤器。缓存击穿:互斥锁、热点数据永不过期。缓存雪崩:过期时间随机、集群部署、服务降级。
查看18道真题和解析
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

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