平均数为k的最长连续子数组(美团2024届秋招笔试第三场编程真题)
题面

核心思想
如果一段区间内的数平均值为k,那么每个数减去k之后平均值就为0
所以每个数-k
然后计算前缀和并放入map
其中:key=前缀和 value=当前下标
出现重复的前缀和preSum 说明存在平均值为k的区间 [mp.get[preSum] + 1, i]
由于需要最长的子数组 所以只记录最先存在的下标
代码
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int a = in.nextInt();
int b = in.nextInt();
HashMap<Long,Integer> mp = new HashMap<>();
mp.put(0L, 0);
Long pre = 0L, cur = 0L;
int res = -1;
for(int i = 1; i <= a; i++){
cur = pre + in.nextInt() - b;
if(mp.containsKey(cur)){
res = Math.max(res, i - mp.get(cur));
}
else mp.put(cur, i);
pre = cur;
}
System.out.println(res);
}
}

浙公网安备 33010602011771号