笔试题共有4题编程题,前3题较为简单,本文给出相应的思路和解答。
第1题
题目大意:给出n个景点,每个景点有相应的分值 a 1 , a 2 , . . . , a n a_1, a_2, ..., a_n a1,a2,...,an。小明一天之内要游玩两个景点 i , j i, j i,j,景点之间的距离为下标之差的绝对值 ∣ i − j ∣ |i-j| ∣i−j∣,满意度为景点的分值之和减去景点之间的距离,公式为 a i + a j + i − j , ( j > i ) a_i+a_j+i-j, (j>i) ai+aj+i−j,(j>i)。要求为小明选出两个景点,给出最大的满意度。
输入:共两行。第一行为n,表示有n个景点;第二行按序给出每个景点的分值。
输出:输出最大的满意度。
解题思路:本题很简单,使用两个for循环即可,但是时间复杂度为 O ( n 2 ) O(n^2) O(n2)。本人就使用此方法解题,但是由于时间复杂度太高,只通过了60%的测试用例。大致代码如下:
public class Solution {
...
public static int handler(int[] arr) {
int max = 0;
for (int i = 0; i < arr.length; ++i) {
for (int j = i + 1; j < arr.length; ++j) {
int temp = arr[i] + arr[j] + i - j;
max = max >= temp ? max : temp;
}
}
return max;
}
}
后来尝试使用 O ( n l o g n ) O(nlogn) O(nlogn)的时间复杂度,但是没有想到合适的办法。在笔试结束后,突然对有了领悟: a i + a j + i − j = ( a i + i ) + ( a j − j ) , ( j > i ) a_i+a_j+i-j = (a_i + i) + (a_j - j), (j>i) a