华为OD机试真题-优雅子数组(C++ Java Python)

目录

题目内容

题目解释

解题思路

题目图解

Java代码

Python代码

C++代码

题目内容


如果一个数组中出现次数最多的元素出现大于等于K次,被称为K -优雅数组,k也可以被称为优雅阈值。例如,数组[ 1,2,3,1、2,3,1 ],它是一个3 - 优雅数组,因为元素 1 出现次数大于等于3次; 再举个例子,数组 [ 1 , 2 , 3 , 1 , 2 ] 就不是一个 3 - 优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次 ( 2 小于 3,因此不满足 3 - 优雅数组的定义)。

给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。

子数组是数组中一个或多个连续元素组成的数组。例如,数组[1.2.3.4]包含10个子数组,分别是:
[1], [1,2], [1,2,3], [1,2,3,4], [2], [2,3], [2,3,4], [3], [3,4] , [4]

输入描述
第一行输入两个数字,以空格隔开,含义是: A数组长度 k值
第二行输入A数组元素,以空格隔开

输出描述
输出A有多少子数组是k-优雅子数组

输入:
7 3
1 2 3 1 2 3 1

输出:
1

题目解释


例如数组[ 1 ,2, 2, 3] ,首先看看它总共有多少个子数组:

[ 1 ]
[ 1, 2 ]
[ 1 , 2 , 2 ]
[ 1, 2 , 2 , 3 ]
[ 2 ]
[ 2 , 2 ]
[ 2 , 2 , 3]
[ 2 , 3 ]
[ 3 ]

然后,我们需要理解什么是 2 - 优雅子数组 。它表示数组中最多的重复元素次数大于等于2。 那么哪些子数组满足条件呢?

[ 1 , 2 , 2 ] :元素 2 出现次数最多,它重复出现 2 次。因此,它是2 - 优雅子数组。

[ 1, 2 , 2 , 3 ]:元素 2 出现次数最多,它重复出现 2 次。因此,它是2 - 优雅子数组。

[ 2 , 2 ]:元素 2 出现次数最多,它重复出现 2 次。因此,它是2 - 优雅子数组。

[ 2 , 2 , 3]:元素 2 出现次数最多,它重复出现 2 次。因此,它是2 - 优雅子数组。

综上所述,在[ 1 ,2, 2, 3]的所有子数组中,总共有 4 个数组满足 2 - 优雅子数组。

解题思路


这道题使用双指针来解题。最开始的时候,两个指针left和right,都指向数组的第一个元素。然后使用哈希表numCount来记录元素出现的次数。

在right指针向右遍历的过程中,将当前元素加入哈希表并更新出现次数。

如果当前元素出现次数大于等于k,那么以left开始,以right结束的子数组都满足k-优雅子数组。

  • 更新left指针的元素在numCount中的次数并向右移动left指针。再次检查,以left开始,以right结束的子数组是否满足k-优雅子数组。如果仍满足,重复本操作。

继续向右移动right指针,重复以上步骤,直到left和right指针都到达数组末尾。

题目图解


我们以 [1 , 2 , 3, 1]为例,寻找 2 - 优雅子数组。

首先,初始化 left 指针, right 指针,都指向数组的第一个元素。
在这里插入图片描述

此时,left 和 right 指针之间的数组为 [ 1 ], 它不满足 2 - 优雅子数组。因此,继续移动 right 指针。

在这里插入图片描述

此时,left 和 right 指针之间的数组为 [ 1 , 2 ], 它不满足 2 - 优雅子数组。因此,继续移动 right 指针。

在这里插入图片描述

此时,left 和 right 指针之间的数组为 [ 1 , 2 , 3 ], 它不满足 2 - 优雅子数组。因此,继续移动 right 指针。

在这里插入图片描述

此时,left 和 right 指针之间的数组为 [ 1 , 2 , 3 , 1 ], 它满足 2 - 优雅子数组。我们将统计结果 +1 。然后,移动 left指针。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

最终,我们寻找到了 1个 2 - 优雅子数组 。

Java代码


import java.util.Scanner;
import java.util.HashMap;

class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int arrayLength = in.nextInt();
        int k = in.nextInt();
        int[] nums = new int[arrayLength];
        for (int i = 0; i < arrayLength; i++) {
            nums[i] = in.nextInt();
        }

        int elegantSubarrays = countElegantSubarrays(arrayLength, k, nums);
        System.out.println(elegantSubarrays);
    }

    public static int countElegantSubarrays(int arrayLength, int k, int[] nums) {
        int result = 0;

        int left = 0;
        int right = 0;
        HashMap<Integer, Integer> numCount = new HashMap<>();

        while (left < arrayLength && right < arrayLength) {
            Integer currentNum = nums[right];
            numCount.put(currentNum, numCount.getOrDefault(currentNum, 0) + 1);
            if (numCount.get(currentNum) >= k) {
                result += arrayLength - right;

                numCount.put(nums[left], numCount.get(nums[left]) - 1);
                left++;

                numCount.put(currentNum, numCount.get(currentNum) - 1);
                right--;
            }
            right++;
        }
        return result;
    }
}

Python代码


import sys
from collections import Counter, defaultdict

def count_kelegant_subarrays(arr_len, k_value, arr_elements):
    result = 0
    left = 0
    right = 0
    element_count = {}

    while (left < arr_len and right < arr_len):
        current_element = arr_elements[right]
        
        if (current_element in element_count):
            element_count[current_element] += 1
        else:
            element_count[current_element] = 1

        if (element_count[current_element] >= k_value):
            result += arr_len - right
            element_count[arr_elements[left]] -= 1
            left += 1
            element_count[current_element] -= 1
            right -= 1
        right += 1

    return result

input_params = [int(x) for x in input().split(" ")]
arr_len = input_params[0]
k_value = input_params[1]
arr_elements = [int(x) for x in input().split(" ")]

print(count_kelegant_subarrays(arr_len, k_value, arr_elements))

C++代码


#include<iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;

vector<int> split_string_to_int(string input) {
    vector<int> nums;
    while (input.find(" ") != string::npos) {
        int found = input.find(" ");
        nums.push_back(stoi(input.substr(0, found)));
        input = input.substr(found + 1);
    }    
    nums.push_back(stoi(input));
    return nums;
}

int main()
{
    string first_line;
    getline(cin, first_line);
    vector<int> params = split_string_to_int(first_line);
    int array_length  = params[0];
    int threshold = params[1];

    string second_line;
    getline(cin, second_line);
    vector<int> numbers = split_string_to_int(second_line);

    int result = 0;

    int left = 0;
    int right = 0;
    map<int, int> num_count;

    // 使用滑动窗口遍历数组
    while (left < array_length && right < array_length) {
        int current_num = numbers[right];
        if (num_count.count(current_num)) {
            num_count[current_num] += 1;
        } else {
            num_count[current_num] = 1;
        }
        
        if (num_count[current_num] >= threshold) {
            result += array_length - right;

            num_count[numbers[left]] -= 1;
            left++;

            num_count[current_num] -= 1;

            right--;
        }
        right++;
    }

    cout << result;

    return 0;
}

华为OD机考双机位C卷 - 优雅数组 (Java & Python& JS & C/C++ & GO ) 华为OD机考双机位C卷 - 优雅数组 (OD上机考试双机位C卷)。提供在线OJ刷题。Java、C++、Python、GO语言、C语言、JavaScript题解,并提供完整思路讲解。 阅读详情

相关推荐

【华为OD机试真题 Python语言】108、 优雅子数组 | 机试真题+思路参考+代码解析

我们可以基于动态规划前缀和的思想,对相同左边界的子数组,只统计初始子数组的内部元素个数,然后每当右边界变化,则基于上一个子数组的统计结果计算出新结果。利用双指针 (即一 个双重for)找到所有子数组(有点暴力), 外层i指针指向子数组左边界,内层j指针指向子数组右边界,然后统计。数组[1, 2,3, 1, 2]就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。例如,数组1, 2, 3, 1,2, 3, 1,它是一个3-优雅数组,因为元素1出现次数大于等于3次,

KJ.JK 3559

【python实现华为OD机试真题】优雅子数组【2023 Q1 | 200分】

当n是优雅数时,就需要额外加上新增的满足条件的子数组,这个数量是上一个优雅数的左边界left和当前优雅数的左边界right的距离。如果一个数组Q中出现次数最多的元素出现大于等于K次,被称为k-优雅数组,k也可以被称为优雅阈值只。这样一维数组形式的dp就存储了所有以当前位置为终点的,且满足K优雅的子数组的数量,最后求。就不是一一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。dp存储的是以当前位置为终点的满足K优雅条件的子数组的个数。注意:子数组是数组中一个或多个连续元素组成的数组。

flying meng的菜鸟居 619

【2023】华为OD机试真题Java-题目0215-优雅数组

如果一个数组中出现次数最多的元素出现大于等于k次,被称为k-优雅数组k也可以被称为优雅阈值。例如,数组,它是一个3-优雅数组,因为元素1出现次数大于等于3次,数组就不是一个3-优雅数组,因为其中出现次数最多的元素时1和2,只出现了2次。给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。子数组是数组中一个或多个连续元素组成的数组。例如,数组[1][1, 2][1, 2, 3][2][2, 3][2, 3, 4][3][3, 4][4]。

amos_cloud的博客 753

【华为OD机试真题】108、 优雅子数组 | 机试真题+思路参考+代码解析(C++、Java、Py、JS)

目描述 >如果一个数组中出现次数最多的元素出现大于等于K次,被称为k-优雅数组,k也可以被称为优雅阈值。 例如,数组1, 2, 3, 1,2, 3, 1,它是一个3-优雅数组,因为元素1出现次数大于等于3次, 数组[1, 2,3, 1, 2]就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。   给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。   子数组是数组中一个或多 个连续元素组成的数组。   例如,数组[1 ,2,3,4]包含10个子数

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 1112

【华为OD机试真题】108、 优雅子数组 | 机试真题+思路参考+代码解析(C语言、C++、Java、Py、JS)

>如果一个数组中出现次数最多的元素出现大于等于K次,被称为k-优雅数组,k也可以被称为优雅阈值。 例如,数组1, 2, 3, 1,2, 3, 1,它是一个3-优雅数组,因为元素1出现次数大于等于3次, 数组[1, 2,3, 1, 2]就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。   给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。   子数组是数组中一个或多 个连续元素组成的数组。   例如,数组[1 ,2,3,4]包含10个子数组,分别

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 711

【华为OD机试真题 2025A卷】108、 优雅子数组 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 2025A卷】108、 优雅子数组 | 机试真题+思路参考+代码解析 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od,华为od算法,华为od手撕代码,华

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 186

【华为OD机试】优雅子数组(python, java, c++, js)

如果一个数组中出现次数最多的元素出现大于等于K次,被称为k-优雅数组,k也可以被称为优雅阈值。

A_D_I_D_A_S的博客 251

2026华为OD机考新系统真题 + 双机位C卷 + 往年真题 - 题库目录分值说明 + 考点说明+在线OJ

2026年4月1日起,华为OD机试正式切换至新系统模式!采用力扣模式,无需自己写输入! 难度大幅度降低。正在备考华为OD机试的同学,优先刷新系统机试真题,可大幅提升通过率。 新系统考题考点与旧版一致,无需重新适应。本专栏所有算法题均配有详细思路解析,并提供C语言、JS、C++、Python、Go、Java多语言源码实现。订阅后私信即可开通专属OJ刷题权限,高效备考一次上岸!

算法大师! 45万+

2026华为OD机试(Python)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,Python实现。

MISAYAONE的博客 29万+

2026华为OD机试(JAVA&Go)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,Java实现。

MISAYAONE的博客 34万+

【华为OD机试真题】108、 优雅子数组 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

🎃题目描述 >如果一个数组中出现次数最多的元素出现大于等于K次,被称为k-优雅数组,k也可以被称为优雅阈值。 例如,数组1, 2, 3, 1,2, 3, 1,它是一个3-优雅数组,因为元素1出现次数大于等于3次, 数组[1, 2,3, 1, 2]就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。   给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。   子数组是数组中一个或多 个连续元素组成的数组。   例如,数组[1 ,2,3,4]包含10

KJ.JK 1万+

2026华为OD机试(C++)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,C++实现。

MISAYAONE的博客 20万+

2026华为OD机试(JavaScript)真题【E卷+A卷+B卷+C卷+D卷】目录+在线OJ

华为OD机试真题题库【E卷+A卷+B卷+C卷+D卷】目录,JavaScript实现。

MISAYAONE的博客 8万+

【华为OD机试真题】A卷-优雅子数组(Python)

【华为OD机试真题】A卷-优雅子数组(Python):如果一个数组中出现次数最多的元素出现大于等于K次,被称为K -优雅数组,k也可以被称为优雅阈值。例如,数组1,2,3,1、2,3,1,它是一个3-优雅数组,因为元素1出现次数大于等于3次,数组1,2,3,1,2就不是一个3-优雅数组,因为其中出现次数最多的元素是1和2,只出现了2次。给定一个数组A和k,请求出A有多少子数组是k-优雅子数组。子数组是数组中一个或多个连续元素组成的数组。

u014481728的博客 852

华为OD机试 2025C卷 2025B卷 真题题库目录|机考题库 + 算法考点详解

华为OD机试 2025C卷 2025B卷 真题题库目录|机考题库 + 算法考点详解 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2025e卷,od机试,2025E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2025华为od,如何备战华为od,华为od算法,华为od手撕代码,华为OD

正在更新最新华为OD机试2025B卷,提供OJ在线刷题 2万+

华为OD机试 新系统 双机位C卷 往年真题 机考题库(持续收录中)以及算法考点详解

每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天优快云在线答疑。

学Java,找哪吒 7万+

在 Windows 上使用 Anaconda 创建 配置 YOLOv8虚拟环境,并更改 pip 源以及以 可编辑模式 安装ultralytics

前往 NVIDIA cuDNN 下载页面,下载与您安装的 CUDA 版本匹配的 cuDNN 版本。:根据您的系统和 CUDA 版本,选择适当的 whl 文件。如下12.7,表示最高可装12.7版本CUDA,与上图中的支持的最高cuda版本一致。,无需重新安装,从而大幅提升开发效率,适用于项目开发、调试或依赖本地未发布的版本时使用,但需确保当前目录包含。:访问 NVIDIA 官方网站,下载与您的显卡和操作系统兼容的 CUDA 版本。首先,确保NVIDIA 显卡支持 CUDA,并安装相应版本的驱动程序。

weixin_44115575的博客 1893

2025年从零开始:构建你的首个ComfyUI工作流-ComfyUI入门教程

然而,由于它拥有众多的插件节点,以及较为复杂的操作流程,学习起来相对困难。以前面搭建的文生图工作流为例,首先点击功能区的【保存】,然后你的浏览器会出来一个弹窗,你可以进行文件命名,点击确定后浏览器会下载该文件,也就是带“json”后缀的文件,这样我们的工作流就打包成一份文件了。思考一下前面说的,节点是不是需要下载安装才能使用,而我们复用别人的工作流,他用的节点你不一定下载了,因为目前有600多个节点,你不可能全部下载了吧,所以我们日后使用别人的工作流,你会经常出现这样的问题。

weixin_59486588的博客 1455

C语言 函数

一、什么是函数 二、函数的相关语法 三、函数编码规范

m0_57105760的博客 1890

全网最全的AItium Designer 16下载资源与安装步骤

Altium Designer 除了全面继承包括Protel 99SE、Protel DXP在内的先前一系列版本的功能和优点外,还增加了许多改进和很多高端功能。该平台拓宽了板级设计的传统界面,全面集成了FPGA设计功能和SOPC设计实现功能,从而允许工程设计人员能将系统设计中的FPGA与PCB设计及嵌入式设计集成在一起。...

WQ的博客 1万+

反激电源及其变压器计算与绕制

本内容以一个宽电压输入 24V3A 输出的 72W 反激电源为例来计算电路的各个参数和器件选型,包含反激变压器的计算与绕制方法。

让你爱上电路设计 1936

C# Modbus通信从入门到精通(2)——Modbus RTU协议原理

本文详细的介绍了Modbus RTU协议的原理,由多年经验高级工程师实战总结而成,绝对干货!

qq_34059233的博客 6384

将 SAP BTP ABAP environment 与 SAP S/4HANA Cloud 公有云版集成:从架构理念到落地实战

本文探讨了在SAP云环境中实现ABAP扩展应用与S/4HANA Cloud系统集成的技术方案。通过建立标准化的远程通信通道,开发者可在SAP BTP ABAP环境中开发扩展应用,同时安全访问S/4HANA Cloud的核心业务数据和服务。文章详细介绍了整体架构设计、开发实现步骤(包括定义通信场景、生成服务消费模型和编写调用代码)以及管理员在S/4HANA侧的配置工作(创建通信安排和技术用户)。通过一个业务伙伴自助注册平台的案例,展示了如何在不修改标准系统的情况下实现云扩展,体现了SAP"干净核心&

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 239

Power Switch与Tap Cell关系

tap cell可以选用一般类型的tap cell,无须secondary pg pin,因为此时switch cell的阱电位接到输入power net上了,switch cell可以正常上电,也可以给core内正常供电,tap cell的阱电位接switch cell输出的power,需要注意的是此时switch cell与core内其他cell的阱电位是不同的,所以为了避免drc问题,需要在switch上盖hard blockage或者keepout margin。2)自带阱偏置的switch。

m0_61544122的博客 2336

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

上一篇: 华为OD机试真题-最大利润【C++ Java Python】
下一篇: 2023华为OD机试真题【大炮攻城】【2023.Q1】
AlgorithmHero
博客等级 码龄4年 606粉丝 1067原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlgorithmHero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值