用友提前批笔试真题0723

Zesari 发布于 2025-03-01 271 次阅读


1 滑动窗口最大值

这个输入输入就当锻炼输入能力了,本题为leetcode 239改编,需要对双端队列Deque熟悉。

写本题时遇到的问题:

1、Deque maxQue = new LinkedList<>(); 这里开头用Deque而不是LinkedList符合面向抽象编程:尽量持有接口,而不是抽象的实现类

2、.split(","),后面括号里面应该是双引号,而非单引号,返回结果为字符串数组String[]

import java.util.*;

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

        // 准备nums
        int leftSquare = str.indexOf('[');
        int rightSquare = str.indexOf(']');

        String[] numsStr = str.substring(leftSquare + 1, rightSquare).split(",");

        int[] nums = new int[numsStr.length];

        for(int i = 0; i < nums.length; i ++) {
            nums[i] = Integer.parseInt(numsStr[i]);
        }

        // 准备k
        int k = Integer.parseInt(str.substring(str.lastIndexOf("=") + 2));

        int res = 0;

        Deque<Integer> maxQue = new LinkedList<>();
        Deque<Integer> minQue = new LinkedList<>();

        for (int i = 0; i < k; i ++) {
            while (!maxQue.isEmpty() && maxQue.getLast() < nums[i]) {
                maxQue.removeLast();
            }
            maxQue.addLast(nums[i]);

            while (!minQue.isEmpty() && minQue.getLast() > nums[i]) {
                minQue.removeLast();
            }
            minQue.addLast(nums[i]);
        }        

        res = maxQue.getFirst() - minQue.getLast();

        for (int i = k; i < nums.length; i ++) {
            // i - k 是要离开的,i 是新进来的
            // 最大
            // 判断离开的是不是最大
            if (nums[i - k] == maxQue.getFirst()) {
                maxQue.removeFirst();
            }

            while (!maxQue.isEmpty() && maxQue.getLast() < nums[i]) {
                maxQue.removeLast();
            }
            maxQue.addLast(nums[i]);

            // 最小
            // 判断离开的是不是最小
            if (nums[i - k] == minQue.getFirst()) {
                minQue.removeFirst();
            }
            
            while (!minQue.isEmpty() && minQue.getLast() > nums[i]) {
                minQue.removeLast();
            }
            minQue.addLast(nums[i]);

            int tempRes = maxQue.getFirst() - minQue.getFirst();
            // System.out.println(tempRes);
            // System.out.println("maxQue.getFirst(): " + maxQue.getFirst());
            // System.out.println("minQue.getFirst(): " + minQue.getFirst());
            if (tempRes > res) {
                res = tempRes;
            }
        }

        System.out.println(res);
    }
}

2 大数减法


import java.util.*;
class Main {
    public static int compare(String a, String b) {
        // 先比较长度
        if (a.length() > b.length()) { // a > b: 3
            return 3;
        } else if (a.length() < b.length()) { // a < b: 2
            return 2;
        }

        // 长度相等,从高位开始逐位比较
        for (int i = 0; i < a.length(); i ++) {
            if (a.charAt(i) - b.charAt(i) > 0) {
                return 1;
            } else if (a.charAt(i) - b.charAt(i) < 0) {
                return 0;
            } else {
                continue;
            }
        }

        // 两数相等
        return -1;
    }

    public static String minus(String a, String b) {
        int whoIsBigger = compare(a, b);

        String zeors = "";

        if (whoIsBigger == 3) {
            // a长,b前补0
            for (int i = 0; i < a.length() - b.length(); i ++) {
                zeors = zeors + "0";
            }
            b = zeors + b;
        }

        if (whoIsBigger == 2) {
            // b长,a前补0
            for (int i = 0; i < b.length() - a.length(); i ++) {
                zeors = zeors + "0";
            }
            a = zeors + a;
        }


        if (whoIsBigger == -1) {
            return "0";
        }

        // b更大,ab换下顺序,最后加负号
        whoIsBigger = compare(a, b);
        if (whoIsBigger == 0) {
            String temp = a;
            a = b;
            b = temp;
        }

        String res = "";
        int jiewei = 0;

        for (int i = a.length() - 1; i >= 0; i --) {

            if (a.charAt(i) - b.charAt(i) - jiewei >= 0) {
                res = (a.charAt(i) - b.charAt(i) - jiewei) + res;
                jiewei = 0;
            } else {
                res = (10 + (a.charAt(i) - b.charAt(i)) - jiewei) + res;
                jiewei = 1;
            }
        }

        // 把前面的0去掉
        int lastZeroIndex = 0;
        for (int i = 0; i < res.length(); i ++) {
            if (res.charAt(i) != '0') {
                lastZeroIndex = i;
                break;
            }
        }

        res = res.substring(lastZeroIndex);

        if (whoIsBigger == 0) {
            res = "-" + res;
        }

        return res;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] input = scanner.nextLine().split(" ");
        System.out.println(minus(input[0], input[1]));
        scanner.close();
    }
}
Hello, It's me.
最后更新于 2025-03-03