校招笔试题目复盘:2020-08-02 拼多多笔试

题目

4 道算法题,得分 96 + 100 + 50(暴力) + 0

第一题

在这里插入图片描述
通过 96% 测试用例,考虑到了“N次骰子之前”而不是第N次,不知道被坑在哪里了?

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int len = sc.nextInt();
        int count = sc.nextInt();
        int[] stepArr = new int[count];
        for (int i = 0; i < count; i++) {
            stepArr[i] = sc.nextInt();
        }

        if (len == 0) {
            System.out.println("paradox");
            return;
        }

        int absLen = len;
        int backStep = 0;
        for (int i = 0; i < count; i++) {
            if (i != count - 1 && absLen - stepArr[i] == 0) {//N次之前
                System.out.println("paradox");
                return;
            } else if(absLen - stepArr[i] == 0){
                System.out.println("0 " + backStep);
                break;
            }else if (absLen < stepArr[i]) {//走超了
                backStep++;
                absLen = stepArr[i] - absLen;
            } else {
                absLen -= stepArr[i];
            }
        }
        System.out.println(absLen + " " + backStep);
    }
}

第二题

在这里插入图片描述

暴力遍历,100% AC

import java.util.*;

class Square {
    int up;
    int down;
    int left;
    int right;
    int front;
    int back;

    public void up2Down() {
        int temp = up;
        up = left;
        left = down;
        down = right;
        right = temp;
    }

    public void left2Right() {
        int temp = back;
        back = right;
        right = front;
        front = left;
        left = temp;
    }

    public void front2Back() {
        int temp = up;
        up = back;
        back = down;
        down = front;
        front = temp;
    }

    public Square(int up, int down, int left, int right, int front, int back) {
        this.up = up;
        this.down = down;
        this.left = left;
        this.right = right;
        this.front = front;
        this.back = back;
    }

    @Override
    public String toString() {
        return "Square{" +
                " " + up +
                " " + down +
                " " + left +
                " " + right +
                " " + front +
                " " + back +
                '}';
    }
}

public class Main {

    public static boolean isSame(Square s1, Square s2) { // 六面相同
        return (s1.front == s2.front && s1.back == s2.back && s1.left == s2.left && s1.right == s2.right && s1.up == s2.up && s1.down == s2.down);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int total = sc.nextInt();
        ArrayList<Square> list = new ArrayList<>();
        for (int i = 0; i < total; i++) {
            int up = sc.nextInt();
            int down = sc.nextInt();
            int left = sc.nextInt();
            int right = sc.nextInt();
            int front = sc.nextInt();
            int back = sc.nextInt();
            list.add(new Square(up, down, left, right, front, back));
        }

        ArrayList<Square> squareKind = new ArrayList<>(); // 不相同的种类
        ArrayList<Integer> squareCount = new ArrayList<>();  // 不相同种类对应骰子个数

        for (int i = 0; i < total; i++) {
            boolean SAME = false;
            for (int j = 0; j < squareKind.size(); j++) {
                if (SAME) break;
                for (int x = 0; x < 4; x++) {
                    if (SAME) break;
                    if (isSame(squareKind.get(j), list.get(i))) {//相同
                        int newCnt = squareCount.get(j);
                        squareCount.set(j, newCnt + 1);
                        SAME = true;
                        break;
                    }
                    list.get(i).front2Back();
                    for (int y = 0; y < 4; y++) {
                        if (SAME) break;
                        if (isSame(squareKind.get(j), list.get(i))) {//相同
                            int newCnt = squareCount.get(j);
                            squareCount.set(j, newCnt + 1);
                            SAME = true;
                            break;
                        }
                        list.get(i).left2Right();
                        for (int z = 0; z < 4; z++) {
                            if (SAME) break;
                            if (isSame(squareKind.get(j), list.get(i))) {//相同
                                int newCnt = squareCount.get(j);
                                squareCount.set(j, newCnt + 1);
                                SAME = true;
                                break;
                            }
                            list.get(i).up2Down();
                        }
                    }
                }
//                System.out.println(SAME);
            }
            if (!SAME) {
                squareKind.add(list.get(i));
                squareCount.add(1);
            }
        }

//        for (int i = 0; i < squareKind.size(); i++) {
//            System.out.println(squareKind.get(i));
//        }
        Collections.sort(squareCount, Collections.reverseOrder());
        System.out.println(squareCount.size());
        for (int i = 0; i < squareCount.size(); i++) {
            System.out.print(squareCount.get(i)+" ");
        }
    }
}

测试用例:

2
1 2 3 4 5 6
1 2 6 5 3 4


3
1 2 3 4 5 6
1 2 6 5 3 4
1 2 3 4 6 5



10
2 5 1 3 4 6
5 4 3 2 1 6
1 4 6 2 3 5
1 5 6 3 4 2
6 4 2 1 5 3
3 6 4 5 2 1
1 6 3 4 2 5
5 1 4 2 6 3
6 2 3 1 5 4
5 3 6 1 4 2

第三题

在这里插入图片描述

暴力解法肯定超时了,仅通过 50%

import java.util.*;

class Meal {
    int hot;
    int delicious;

    public Meal(int hot, int delicious) {
        this.hot = hot;
        this.delicious = delicious;
    }
}

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

        int needDelicious = sc.nextInt();
        if (needDelicious == 0) {//不用吃饭
            System.out.println(0);
            return;
        }

        ArrayList<Meal> noonList = new ArrayList<>();
        for (int i = 0; i < noonCount; i++) {
            int hot = sc.nextInt();
            int delicious = sc.nextInt();
            noonList.add(new Meal(hot, delicious));
        }

        ArrayList<Meal> dinnerList = new ArrayList<>();
        for (int i = 0; i < dinnerCount; i++) {
            int hot = sc.nextInt();
            int delicious = sc.nextInt();
            dinnerList.add(new Meal(hot, delicious));
        }

        int minHot = Integer.MAX_VALUE;
        for (int i = 0; i < noonCount; i++) {
            if (noonList.get(i).hot > minHot) continue;//剪枝
            for (int j = 0; j < dinnerCount; j++) {
                if (dinnerList.get(j).hot > minHot) continue;//剪枝

                int noonDeli = noonList.get(i).delicious;
                int noonHot = noonList.get(i).hot;
                int dinnerDeli = dinnerList.get(j).delicious;
                int dinnerHot = dinnerList.get(j).hot;

                if (noonDeli >= needDelicious) {//只吃午饭
                    minHot = noonHot < minHot ? noonHot : minHot;
                } else if (dinnerDeli >= needDelicious) {//只吃晚饭
                    minHot = dinnerHot < minHot ? dinnerHot : minHot;
                } else if (noonDeli + dinnerDeli >= needDelicious) {//都吃
                    minHot = noonHot + dinnerHot < minHot ? noonHot + dinnerHot : minHot;
                }
            }
        }
        if (minHot == Integer.MAX_VALUE) {
            System.out.println(-1);
        } else {
            System.out.println(minHot);
        }

    }
}

// 测试用例

5 1 9
9 1
4 9
3 1
2 3
6 5
9 8


1 1 0
3 1
2 1


3 3 10
1 1
2 5
3 7
2 4
4 8
6 9



2 1 4
3 1
2 1
1 2


第四题

没时间了,没仔细读题,貌似是类似于填棋盘格子,相同元素不能相邻之类的…

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/107753487