24年9月8日 小红书数据开发笔试

前言

题目挺难,涉及hadoop、spark等内容,且计算机网络、操作系统、数据结构与算法也均涉及。

20题选择题(多选、单选均有),40分

3题编程算法题,分值分别为 15、20和25分。

惭愧,只a了最后一题算法题。

第二题看着有点复杂,时间不太够了,就一点没做

第一题

给n个正整数组成的数组,a1、a2、a3,...., an,任意 l, r (l <= r) ,al + ... + ar 即为一个区间和。

现在可以调整数组顺序,对所有区间和进行求和,返回该结果和。


import java.util.Arrays;
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = in.nextInt();
        }
        Solution solution = new Solution(nums);
        System.out.println(solution.solute());
    }
}
class Solution{
    int[] nums;
    int[] timesArr;
    int n;

    public Solution(int[] nums) {
        this.nums = nums;
        this.n = nums.length;
        this.timesArr = new int[n];
        setTimes();
    }

    public int solute(){

        Arrays.sort(nums);
        int[] locateArr = new int[n];
        int left = 0;
        int right = n - 1;
        for(int i = 0; i < n; i++){
            if(i % 2 == 0){
                locateArr[left++] = nums[n - 1 - i];
            } else {
                locateArr[right--] = nums[n - 1 - i];
            }
        }
        int sum = 0;
        for (int i = 0; i < n; i++) {
            sum += timesArr[i] * locateArr[i];
        }
        return sum;
    }


    public void setTimes(){
        timesArr[0] = n;
        for(int i = 1; i < n / 2; i++){
            timesArr[i] = timesArr[i - 1] + n - i * 2;
        }
        int left = 0;
        int right = n - 1;
        while(left < right){
            timesArr[right--] = timesArr[left++];
        }
        if(n % 2 != 0){
            int mid = n / 2;
            timesArr[mid] = timesArr[mid - 1] + n - mid * 2;
        }
    }
}

搞不清楚为啥只有27%哈哈哈,感觉已经想的很通透了?(自我以为

第三题

给n个正整数组成的数组,a1、a2、a3,...., an。如果 al = ar,那么[l, r]就称为好区间。

那么,任意查询q次,每次输入两个数字分别代表 l 和 r

输出这q次查询 l 和 r 之间最长的好区间长度。


import java.util.Scanner;


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

        int[] nums = new int[n + 1];
        for (int i = 0; i < n; i++) {
            nums[i + 1] = in.nextInt();
        }
        Solute solute = new Solute(nums);
        for (int i = 0; i < q; i++) {
            System.out.println(solute.getMaxGood(in.nextInt(), in.nextInt()));
        }
    }
}

class Solute {
    int[] nums;
    int n;
    int[] leftDiffArr;
    int[] rightDiffArr;

    public Solute(int[] nums) {
        this.nums = nums;
        this.n = nums.length - 1;
        this.leftDiffArr = new int[n + 1];
        this.rightDiffArr = new int[n + 1];
        leftDiffArr[1] = -1;
        for (int i = 2; i <= n; i++) {
            if (nums[i] != nums[i - 1]) {
                leftDiffArr[i] = i - 1;
            } else {
                leftDiffArr[i] = leftDiffArr[i - 1];
            }

        }
        rightDiffArr[n] = n + 1;
        for (int i = n - 1; i >= 1; i--) {
            if (nums[i] != nums[i + 1]) {
                rightDiffArr[i] = i + 1;
            } else {
                rightDiffArr[i] = rightDiffArr[i + 1];
            }

        }

    }

    public int getMaxGood(int left, int right) {
        if (nums[left] != nums[right])
            return right - left + 1;
        int newLeftIndex = rightDiffArr[left];
        if (newLeftIndex >= right)
            return 0;
        int newRightIndex = leftDiffArr[right];
        if (right - newLeftIndex > newRightIndex - left) {
            return right - newLeftIndex + 1;
        } else {
            return newRightIndex - left + 1;
        }
    }
}

#小红书##题目描述#
全部评论
27应该是没用long
点赞 回复 分享
发布于 09-08 17:43 北京

相关推荐

5 6 评论
分享
牛客网
牛客企业服务