0913 滴滴笔试 java

比较简单,两题编程。

选择题好像是 20 题,有部分不确定,有 C++的几题。

题目记不清了,凭印象写一下

编程题

第一题 充电

第一题:n个玩具,m 电量,尽可能让一个大的区间内的玩具的电量充满。输出充满电的玩具个数 。

双指针+滑动窗口。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        new Main().run();
    }

    // n个玩具,m 电量,尽可能让一个大的区间内的玩具的电量充满。既然是连续的,那直接维护m即可。如果电量不足,则排出头部元素,补充电量。

    public void run(){
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        long m = sc.nextLong();
        int[] charge = new int[n];
        for(int i = 0; i < n; i++) charge[i] = sc.nextInt();

        // 双指针
        int ans = 0;
        int idx = 0;  // 头部元素
        for(int i = 0; i < n; i++){

            while(m < charge[i]){
                m += charge[idx++];
            }

            if(m >= charge[i]){
                m -= charge[i];
            }

            ans = Math.max(ans, i - idx + 1);
        }
        System.out.println(ans);
    }
}

第二题 变化排行榜

题意:有一个排行榜,长度是 n,然后现在可以接收 n 个 op,如果是 1 则需要调低这首歌的位置,如果是 0 则不变,如果是 -1 则需要调高这个歌的位置。如果有冲突则不行,输出 NO,否则输出 YES。

可能是样例比较弱,有些情况没考虑也过了。写的丑了点,还能优化其实

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

public class Main {
    public static void main(String[] args) {
        new Main().run();
    }
    Scanner sc = new Scanner(System.in);
    public void run(){
        int T = sc.nextInt();
        while(T --> 0){
            solve();
        }
    }

    // 有一个排行榜,长度是 n,然后现在可以接收 n 个 op,如果是 1 则需要调低这首歌的位置,如果是 0 则不变,如果是-1则需要调高这个歌的位置。
    // 如果有冲突则不行,输出 NO,否则输出 YES
    public void solve() {
        int n = sc.nextInt();

        boolean[] cantMove = new boolean[n + 1];   // 从第一名开始
        List<Integer> up = new ArrayList<>();   // 记录需要调高的位置(即op 为-1
        List<Integer> down = new ArrayList<>();  // 需要调低的,op 为 1

        for(int i = 0; i < n; i++){
            int op = sc.nextInt();
            int pos = sc.nextInt();

            if(op == 1) down.add(pos);
            else if(op == -1) up.add(pos);
            else cantMove[pos] = true;  // 表示不能动了
        }


//        System.out.println(Arrays.toString(cantMove));

        // 还有一点需要注意,如果对于同一首歌有不同的请求,那应该也要输出 NO,存在冲突了。

        // 对于需要上升的歌,需要从最高的位置(从小到大)开始判断存不存在可以调换的歌(前面有可以移动的)。如果存在则说明当前他的位置不用管,然后把那个可以被移动的歌的位置更新为不可动,防止后续判断出错
        up.sort((a, b) -> a - b);
        for(int pos : up){
            boolean flag = false;  // 标记当前数前面是否存在可移动到的位置
            for(int i = 1; i < pos; i++){
                if(!cantMove[i]){
                    // 可以被移动过来
                    cantMove[i] = true;
                    flag = true;
                    break;
                }
            }
            if(!flag) {
                System.out.println("NO");
                return;
            }
        }

//        System.out.println(up);

        // 到达这里说明上升没问题,同理如果需要下降的歌得判断后面的歌是否能被替换
        down.sort((a, b) -> b - a);

        for(int pos : down){
            boolean flag = false;

            // 注意边界,当前位置肯定能放啊,所以不能取 pos
            for(int i = n; i > pos; i--){
                if(!cantMove[i]){
                    cantMove[i] = true;
                    flag = true;
                    break;
                }
            }
            if(!flag) {
                System.out.println("NO");
                return;
            }
        }

//        System.out.println(down);

        // 左右都可以移动,不冲突
        System.out.println("YES");
    }
}

#笔试##滴滴##Java##软件开发笔面经#
后端开发笔面经 文章被收录于专栏

主要收录一部分我的笔试面试经历文章,欢迎订阅。

全部评论
我第一题用的dp,第二题贪心
点赞 回复 分享
发布于 09-14 07:26 陕西
第一题前缀和加双指针,第二题一开始总感觉像拓扑排序,最后没写了,骗了百分之18
点赞 回复 分享
发布于 09-15 13:01 北京
第二题感觉写复杂了呀,判断第一个-1前面有没有1 && 最后一个1后面有没有-1
点赞 回复 分享
发布于 09-16 11:43 江西

相关推荐

点赞 评论 收藏
分享
10-21 20:25
浙江大学 C++
点赞 评论 收藏
分享
5 9 评论
分享
牛客网
牛客企业服务