网易笔试|网易笔试到底有多难( 二 )


void f(int a[], int m[]){ int n = a.length; int[] arr = new int[151]; //先统计分数为 i 的有多少人 for(int i = 0; i < n; i++){ arr[a[i]]++; } // 接着构造前缀和 for(int i = 1; i < 151; i++){ arr[i] = arr[i] + arr[i-1]; } // 进行 m 次询问 for(int i = 0; i < m.length; i++){ // 取出成绩 int score = a[m[i]-1]; // 有多少人的成绩不超过 score的 int sum = arr[score]; System.out.printf("%.6f\n", sum * 1.0 / n * 100 ); }}这种方法就叫做前缀和,用这种方法简单了很多 。当然前缀和还有其他应用,例如:
如果给你一个数组 arr[],然后进行 m 次询问,每次询问输入两个数 i,j(i <= j) 。要求你输出 arr[i] ~ arr[j] 这个区间的和 。这个时候就可以使用前缀和的方式了 。前缀和的构造也是很好构造的,例如 arr[] 变成前缀和的构造方式如下
for(int i = 1; i < arr.length; i++){ arr[i] = arr[i] + arr[i-1];}前缀和看起来还是挺简单的,不过在做题中,或许会有意想不到的作用,例如这次的笔试,所以今天给大家讲解一下 。
最后我再问你一个和前缀和类似的问题,给你一串长度为n的数列a1,a2,a3……an,要求对a[i]~a[j]进行m次操作:
操作一:将a[i]~a[j]内的元素都加上P
操作二:将a[i]~a[j]内的元素都减去P
最后再给出一个询问求a[i]-a[j]内的元素之和 。
这个你会怎么做呢?这个时候就涉及到差分的知识了,不过它和前缀和类似,感兴趣的可以研究一下 。
最后
这里关于笔试题有几点建议,由于笔试题大多数都需要我们处理输入输出,而像 leetcode,剑指 offer 都是不需要我们处理这些的,所以会不熟悉,所以我建议可以去刷下往年的真题熟悉一下 。
还有就是大部分都是可以直接暴力的,然后能拿 20%~30%的分数,想了十分钟还是没好的思路的,建议直接暴力 。
还有就是有时候笔试是不准你用本地 IDE 的,所以我建议平时刷题的时候,直接再网页打代码,别跑到本地 IDE 打好再粘贴过来 。

【网易笔试|网易笔试到底有多难】