华为笔试题OD
1题 华为od-2022.11.5-k优雅阈值
题目内容
如果一个数组中出现次数最多的元素出现大于等于 �k 次, 被称为 �−优雅数组k−优雅数组 , �k 也可以被称为优雅阈值。
例如,数组 [1,2,3,1,2,3,1][1,2,3,1,2,3,1] ,它是个 3−优雅数组3−优雅数组 ,因为元素 11 出现次数大于等于 33 次,数组 [1,2,3,1,2][1,2,3,1,2] 就不是一个 3−优雅数组3−优雅数组, 因为其中出现次数最多的元素是 11 和 22 ,只出现了 22 次。
给定一个数组 �A 和 �k ,请求出 �A 有多少子数组是 �−优雅子数组k−优雅子数组 。
子数组是数组中一个或多个连续元素组成的数组。
例如,数组 [1,2,3,4][1,2,3,4] 包含 1010 个子数组,分别是: [1][1] , [1,2][1,2] , [1,2,3][1,2,3] , [1,2,3,4][1,2,3,4] , [2][2] , [2,3][2,3] , [2,3,4][2,3,4] , [3][3] ,[3,4][3,4] , [4][4]
输入描述
第一行输入两个整数 �≤10000n≤10000 和 �≤�k≤n 。 1≤��≤�1≤a**i≤n
第二行输入 �n 个整数。
输出描述
输出给定的数组中有多少子数组是 �−优雅子数组k−优雅子数组
样例
输入
7 3
1 2 3 1 2 3 1
[Copy](javascript:😉
输出
1
思路
滑动窗口思想,首先我们定义2个指针,分别为左指针和右指针,我们右指针依次遍历元素,如果某一个元素出现的个数大于等于k了,那么就记录当前符合要求的是(数组长度 - 右指针下标),然后左指针自加1然后在判断右指针所在的元素出现的个数是否满足出现个数大于等于k,如果满足就在+1,一直重复此操作,直到不符合要求。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class P1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();

文章提供了两道华为的在线测试(OD)题目。第一题涉及数组子数组的优雅阈值计算,采用滑动窗口思路解决。第二题是关于银行客户插队问题,利用优先级队列处理。
最低0.47元/天 解锁文章
1207





