当前位置: 首页 > news >正文

华为OD机试真题——统计匹配的二元组个数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

在这里插入图片描述

2025 A卷 100分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

2025华为OD真题目录+全流程解析/备考攻略/经验分享

华为OD机试真题《统计匹配的二元组个数》:


目录

    • 题目名称:统计匹配的二元组个数
      • 题目描述
    • Java
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • python
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • JavaScript
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • C++
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码逐行解析
      • 示例测试
      • 综合分析
    • C语言
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • GO
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 示例测试
      • 综合分析
    • 更多内容:


题目名称:统计匹配的二元组个数


知识点:数组、哈希表
时间限制:1秒
空间限制:32MB
限定语言:不限


题目描述

给定两个数组A和B,统计满足A[i] == B[j]的二元组(i,j)的总个数。

输入描述

  • 第一行输入数组A的长度M
  • 第二行输入数组B的长度N
  • 第三行输入数组A的元素(空格分隔)
  • 第四行输入数组B的元素(空格分隔)

输出描述
输出匹配的二元组个数。若不存在匹配,输出0。

示例1
输入:

5  
4  
1 2 3 4 5  
4 3 2 1  

输出:

4  

示例2
输入:

6  
3  
1 2 4 4 2 1  
1 2 3  

输出:

4  

Java

问题分析

我们需要统计两个数组A和B中满足A[i] == B[j]的二元组(i,j)的总个数。直接遍历所有可能的组合会导致时间复杂度为O(M*N),但通过哈希表优化可以将时间复杂度降低到O(M + N)。


解题思路

  1. 哈希表统计频率:遍历数组A,用哈希表记录每个元素出现的次数。
  2. 遍历数组B匹配:遍历数组B,对于每个元素,在哈希表中查找其出现次数并累加。

代码实现

import java.util.*;
import java.io.*;public class Main {public static void main(String[] args) throws IOException {// 使用BufferedReader读取输入,避免Scanner的换行符问题BufferedReader br = new BufferedReader(new InputStreamReader(System.in));// 读取数组A和B的长度int M = Integer.parseInt(br.readLine());int N = Integer.parseInt(br.readLine());// 读取数组A的元素并转换为整型数组String[] aParts = br.readLine().split(" ");int[] a = new int[M];for (int i = 0; i < M; i++) {a[i] = Integer.parseInt(aParts[i]);}// 读取数组B的元素并转换为整型数组String[] bParts = br.readLine().split(" ");int[] b = new int[N];for (int i = 0; i < N; i++) {b[i] = Integer.parseInt(bParts[i]);}// 创建哈希表统计数组A中每个元素的出现次数Map<Integer, Integer> countMap = new HashMap<>();for (int num : a) {countMap.put(num, countMap.getOrDefault(num, 0) + 1);}// 遍历数组B,累加匹配次数int result = 0;for (int num : b) {result += countMap.getOrDefault(num, 0);}// 输出结果System.out.println(result);}
}

代码详细解析

  1. 读取输入

    • BufferedReader逐行读取输入,避免Scanner的换行符问题。
    • 前两行读取数组A和B的长度MN
    • 第三行读取数组A的元素并转换为整型数组。
    • 第四行读取数组B的元素并转换为整型数组。
  2. 统计数组A的元素频率

    • 使用HashMap存储数组A中每个元素及其出现次数。
    • countMap.getOrDefault(num, 0)确保元素不存在时返回0。
  3. 遍历数组B计算匹配次数

    • 对数组B中的每个元素,查找其在哈希表中的出现次数。
    • 累加所有匹配次数,得到最终结果。

示例测试

示例1输入

5
4
1 2 3 4 5
4 3 2 1

输出

4

解析

  • 数组A中每个元素出现1次,数组B中的元素4、3、2、1均能在A中找到,总共有4对。

示例2输入

6
3
1 2 4 4 2 1
1 2 3

输出

4

解析

  • 数组A中1出现2次、2出现2次,数组B中的1和2分别匹配2次,总共有4次。

综合分析

  1. 时间复杂度

    • 统计频率:O(M),遍历数组A一次。
    • 匹配计算:O(N),遍历数组B一次。
    • 总复杂度:O(M + N),线性时间复杂度。
  2. 空间复杂度

    • 哈希表存储:O(M),存储数组A中所有不同元素及其频率。
  3. 优势

    • 高效性:相比暴力法的O(M*N),哈希表将复杂度优化到O(M + N)。
    • 代码简洁:逻辑清晰,易于理解和维护。
  4. 适用场景

    • 处理大规模数据时,哈希表方法能显著提升性能。
    • 适用于需要快速查找元素出现次数的场景。

python

问题分析

我们需要统计两个数组A和B中满足A[i] == B[j]的二元组(i,j)的总个数。直接遍历所有可能的组合会导致时间复杂度为O(M*N),但通过哈希表优化可以将时间复杂度降低到O(M + N)。


解题思路

  1. 哈希表统计频率:遍历数组A,用字典记录每个元素出现的次数。
  2. 遍历数组B匹配:遍历数组B,对于每个元素,在字典中查找其出现次数并累加。

代码实现

def main():import sys# 读取输入数据m = int(sys.stdin.readline())       # 读取数组A的长度n = int(sys.stdin.readline())       # 读取数组B的长度# 读取数组A的元素并转换为整数列表a = list(map(int, sys.stdin.readline().split()))# 验证数组长度是否匹配输入值if len(a) != m:print(0)return# 读取数组B的元素并转换为整数列表b = list(map(int, sys.stdin.readline().split()))# 验证数组长度是否匹配输入值if len(b) != n:print(0)return# 创建字典统计数组A中每个元素的出现次数count_dict = {}for num in a:# 如果元素存在,计数+1;不存在则初始化为0后+1count_dict[num] = count_dict.get(num, 0) + 1# 遍历数组B,统计总匹配次数total = 0for num in b:# 从字典中获取该元素的出现次数(默认0次)total += count_dict.get(num, 0)print(total)if __name__ == "__main__":main()

代码详细解析

  1. 输入处理

    • sys.stdin.readline() 逐行读取输入,避免缓冲区问题
    • mn 分别读取数组A和B的长度
    • a = list(map(...)) 将输入行分割为字符串列表并转换为整数列表
    • 验证数组长度是否与输入值一致,防止数据错误
  2. 频率统计字典

    • 创建空字典 count_dict 存储元素频率
    • count_dict.get(num, 0) 是字典的安全访问方法:
      • 当元素存在时返回当前计数值
      • 不存在时返回默认值0
    • 遍历数组A时,每个元素计数+1
  3. 匹配计算

    • 遍历数组B的每个元素
    • count_dict.get(num, 0) 获取该元素在A中的出现次数
    • 所有匹配次数累加到total
  4. 边界处理

    • 数组长度验证防止数据格式错误
    • 不存在的元素自动按0次处理

示例测试

示例1输入

5
4
1 2 3 4 5
4 3 2 1

输出

4

解析

  • A中每个元素出现1次
  • B中的4、3、2、1均能在A中找到
  • 总匹配次数 = 1+1+1+1 = 4

示例2输入

6
3
1 2 4 4 2 1
1 2 3

输出

4

解析

  • A中1出现2次,2出现2次,4出现2次
  • B中的1匹配2次,2匹配2次,3匹配0次
  • 总匹配次数 = 2+2+0 = 4

综合分析

  1. 时间复杂度

    • 统计频率:O(M),遍历数组A一次
    • 匹配计算:O(N),遍历数组B一次
    • 总复杂度:O(M + N),线性时间复杂度
  2. 空间复杂度

    • 字典存储:最差O(M)(所有元素不同时)
    • 输入存储:O(M + N) 存储两个数组
  3. 性能优势

    • 相比暴力法的O(M*N),效率提升数百倍
    • 例如当M=N=105时,暴力法需1010次运算(不可行),而哈希法仅需2*10^5次
  4. 适用场景

    • 大规模数据处理(如M=1e6, N=1e6)
    • 需要频繁查询元素出现次数的场景
    • 元素取值范围较大的情况(哈希表不依赖连续空间)
  5. Python特性利用

    • 字典的get()方法简化了"存在性检查+默认值"逻辑
    • map()函数高效处理类型转换
    • 动态列表自动处理变长数据
  6. 扩展性

    • 支持非整数类型(只需可哈希)
    • 可轻松修改为统计三元组、四元组等
    • 适用于分布式计算(分块统计频率后合并)

JavaScript

问题分析

我们需要统计两个数组 A 和 B 中满足 A[i] == B[j] 的二元组 (i, j) 的总个数。直接遍历所有组合的时间复杂度为 O(M*N),但通过哈希表优化可以将时间复杂度降低到 O(M + N)。


解题思路

  1. 哈希表统计频率:遍历数组 A,用哈希表记录每个元素出现的次数。
  2. 遍历数组 B 匹配:遍历数组 B,对于每个元素,在哈希表中查找其出现次数并累加。

代码实现

const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout,terminal: false
});// 输入处理逻辑
let lineCount = 0;
let M, N, A, B;rl.on('line', (line) => {switch (lineCount) {case 0: // 读取数组A的长度MM = parseInt(line.trim());break;case 1: // 读取数组B的长度NN = parseInt(line.trim());break;case 2: // 读取数组A的元素A = line.trim().split(/\s+/).map(Number);if (A.length !== M) {console.log(0);process.exit();}break;case 3: // 读取数组B的元素B = line.trim().split(/\s+/).map(Number);if (B.length !== N) {console.log(0);process.exit();}processInput(); // 处理输入数据break;}lineCount++;
});function processInput() {// 统计A中元素的频率const countMap = {};for (const num of A) {countMap[num] = (countMap[num] || 0) + 1;}// 计算总匹配次数let total = 0;for (const num of B) {total += countMap[num] || 0;}console.log(total);rl.close();
}

代码详细解析

  1. 输入处理

    const rl = readline.createInterface(...) // 创建输入接口
    rl.on('line', ...)                       // 监听每一行输入
    
    • 使用 Node.js 的 readline 模块逐行读取输入
    • 通过 switch 语句处理不同行的输入内容
  2. 数组验证

    if (A.length !== M) { ... } // 验证数组A长度
    if (B.length !== N) { ... } // 验证数组B长度
    
    • 检查输入数组长度是否与声明的长度一致
    • 发现不一致立即输出 0 并退出
  3. 哈希表统计

    const countMap = {};
    for (const num of A) {countMap[num] = (countMap[num] || 0) + 1;
    }
    
    • 使用普通对象作为哈希表
    • (countMap[num] || 0) 实现类似 Python 的 get() 方法
  4. 匹配计算

    for (const num of B) {total += countMap[num] || 0;
    }
    
    • 遍历数组 B 的每个元素
    • 累加哈希表中对应元素的出现次数

示例测试

示例1输入

5
4
1 2 3 4 5
4 3 2 1

输出

4

解析

  • A 中每个元素出现1次
  • B 中的 4、3、2、1 均能在 A 中找到
  • 总匹配次数 = 1+1+1+1 = 4

示例2输入

6
3
1 2 4 4 2 1
1 2 3

输出

4

解析

  • A 中 1 出现2次,2 出现2次
  • B 中的 1 匹配2次,2 匹配2次
  • 总匹配次数 = 2+2+0 = 4

综合分析

  1. 时间复杂度

    • 统计频率:O(M),遍历数组A一次
    • 匹配计算:O(N),遍历数组B一次
    • 总复杂度:O(M + N),线性时间复杂度
  2. 空间复杂度

    • 哈希表存储:最差 O(M)(所有元素不同时)
    • 输入存储:O(M + N) 存储两个数组
  3. 性能优势

    • 相比暴力法 O(M*N) 的复杂度,效率提升数百倍
    • 例如当 M=N=10^5 时,暴力法需要 1e10 次运算(不可行),而哈希法仅需 2e5 次
  4. JavaScript 特性利用

    • 对象动态属性实现哈希表
    • || 运算符实现默认值
    • map(Number) 快速类型转换
  5. 扩展性

    • 支持非数字类型(需可哈希)
    • 可轻松修改为统计三元组等复杂场景
    • 适用于浏览器和 Node.js 双环境

C++

问题分析

给定两个数组A和B,统计满足A[i] == B[j]的二元组(i,j)的总个数。直接遍历所有组合的时间复杂度为O(M*N),但通过哈希表优化可以将时间复杂度降低到O(M + N)。


解题思路

  1. 哈希表统计频率:遍历数组A,用unordered_map记录每个元素出现的次数。
  2. 遍历数组B匹配:遍历数组B,对于每个元素,在哈希表中查找其出现次数并累加。

代码实现

#include <iostream>
#include <vector>
#include <sstream>
#include <unordered_map>using namespace std;int main() {int M, N;// 读取数组A和B的长度cin >> M >> N;// 清除输入缓冲区中的换行符cin.ignore(numeric_limits<streamsize>::max(), '\n');// 读取数组A的元素string lineA;getline(cin, lineA);vector<int> A;stringstream ssA(lineA);int num;while (ssA >> num) {A.push_back(num);}// 验证数组A长度if (A.size() != M) {cout << 0 << endl;return 0;}// 读取数组B的元素string lineB;getline(cin, lineB);vector<int> B;stringstream ssB(lineB);while (ssB >> num) {B.push_back(num);}// 验证数组B长度if (B.size() != N) {cout << 0 << endl;return 0;}// 统计数组A中每个元素的出现次数unordered_map<int, int> countMap;for (int num : A) {countMap[num]++;}// 遍历数组B统计总匹配次数int total = 0;for (int num : B) {total += countMap[num]; // 若不存在则返回0}cout << total << endl;return 0;
}

代码逐行解析

  1. 输入处理

    cin >> M >> N;  // 读取数组A和B的长度
    cin.ignore(...); // 清除缓冲区中的换行符
    getline(cin, lineA); // 读取数组A的元素行
    
    • 使用cin读取数组长度后,必须用cin.ignore()清除缓冲区残留的换行符
    • getline按行读取数组元素,避免空格和换行符干扰
  2. 数组元素解析

    stringstream ssA(lineA); // 将字符串转换为流
    while (ssA >> num) { ... } // 逐个读取整数
    
    • stringstream将字符串按空格分割为整数流
    • vector动态存储数组元素
  3. 哈希表统计

    unordered_map<int, int> countMap;
    for (int num : A) { countMap[num]++; }
    
    • unordered_map以O(1)时间复杂度实现键值查找
    • 遍历数组A时,每个元素在哈希表中计数+1
  4. 匹配次数计算

    total += countMap[num]; // 若不存在则返回0
    
    • 直接通过countMap[num]访问次数,未找到时返回0
    • 遍历数组B时累加所有匹配次数

示例测试

示例1输入

5 4
1 2 3 4 5
4 3 2 1

输出

4

解析

  • A中的每个元素出现1次
  • B中的4、3、2、1均能在A中找到,总匹配次数=1+1+1+1=4

示例2输入

6 3
1 2 4 4 2 1
1 2 3

输出

4

解析

  • A中1出现2次,2出现2次
  • B中的1匹配2次,2匹配2次,3匹配0次
  • 总匹配次数=2+2+0=4

综合分析

  1. 时间复杂度

    • 统计频率:O(M),遍历数组A一次
    • 匹配计算:O(N),遍历数组B一次
    • 总复杂度:O(M + N),线性时间复杂度
  2. 空间复杂度

    • 哈希表存储:最差O(M)(所有元素不同时)
    • 输入存储:O(M + N) 存储两个数组
  3. 性能优势

    • 相比暴力法的O(M*N),效率提升数百倍
    • 例如当M=N=10^5时,暴力法需要1e10次运算(不可行),哈希法仅需2e5次
  4. C++特性利用

    • unordered_map实现哈希表,平均O(1)查询时间
    • stringstream处理复杂的输入分割逻辑
    • vector动态数组自动管理内存
  5. 扩展性

    • 支持非整型数据(需自定义哈希函数)
    • 可轻松修改为统计三元组等复杂场景
    • 适用于高性能计算场景(如嵌入式系统)

C语言

问题分析

我们需要统计两个数组A和B中满足A[i] == B[j]的二元组(i,j)的总个数。直接遍历所有组合的时间复杂度为O(M*N),但通过哈希表优化可以将时间复杂度降低到O(M + N)。


解题思路

  1. 哈希表统计频率:遍历数组A,使用哈希表记录每个元素出现的次数。
  2. 遍历数组B匹配:遍历数组B,对于每个元素,在哈希表中查找其出现次数并累加。

代码实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>#define HASH_SIZE 10007 // 哈希表大小,质数减少冲突typedef struct HashNode {int key;           // 存储元素值int value;         // 存储出现次数struct HashNode *next;
} HashNode;typedef struct {HashNode **buckets; // 哈希桶数组int size;           // 哈希表大小
} HashMap;// 创建哈希表
HashMap* createHashMap(int size) {HashMap *map = (HashMap*)malloc(sizeof(HashMap));map->size = size;map->buckets = (HashNode**)calloc(size, sizeof(HashNode*)); // 初始化为空指针return map;
}// 插入元素到哈希表
void put(HashMap *map, int key) {int index = abs(key) % map->size; // 哈希函数:绝对值取模处理负数HashNode *current = map->buckets[index];// 遍历链表,查找是否已存在该键while (current != NULL) {if (current->key == key) {current->value++; // 存在则计数加1return;}current = current->next;}// 创建新节点插入链表头部HashNode *newNode = (HashNode*)malloc(sizeof(HashNode));newNode->key = key;newNode->value = 1;newNode->next = map->buckets[index];map->buckets[index] = newNode;
}// 查询元素出现次数
int get(HashMap *map, int key) {int index = abs(key) % map->size;HashNode *current = map->buckets[index];// 遍历链表查找键while (current != NULL) {if (current->key == key) {return current->value;}current = current->next;}return 0; // 未找到返回0
}// 释放哈希表内存
void freeHashMap(HashMap *map) {for (int i = 0; i < map->size; i++) {HashNode *current = map->buckets[i];while (current != NULL) {HashNode *temp = current;current = current->next;free(temp);}}free(map->buckets);free(map);
}int main() {char line[1000000];int M, N;// 读取数组A和B的长度fgets(line, sizeof(line), stdin);sscanf(line, "%d", &M);fgets(line, sizeof(line), stdin);sscanf(line, "%d", &N);// 读取数组A的元素fgets(line, sizeof(line), stdin);int *A = (int*)malloc(M * sizeof(int));int count = 0;char *token = strtok(line, " ");while (token != NULL && count < M) {A[count++] = atoi(token);token = strtok(NULL, " ");}if (count != M) { // 验证元素数量是否正确printf("0\n");free(A);return 0;}// 读取数组B的元素fgets(line, sizeof(line), stdin);int *B = (int*)malloc(N * sizeof(int));count = 0;token = strtok(line, " ");while (token != NULL && count < N) {B[count++] = atoi(token);token = strtok(NULL, " ");}if (count != N) { // 验证元素数量是否正确printf("0\n");free(A);free(B);return 0;}// 创建哈希表并统计A的频次HashMap *map = createHashMap(HASH_SIZE);for (int i = 0; i < M; i++) {put(map, A[i]);}// 遍历B数组累加匹配次数int total = 0;for (int i = 0; i < N; i++) {total += get(map, B[i]);}printf("%d\n", total);// 释放内存freeHashMap(map);free(A);free(B);return 0;
}

代码详细解析

  1. 哈希表结构定义

    • HashNode:链表节点,存储键、值和下一个节点的指针。
    • HashMap:哈希表结构,包含桶数组和大小。
  2. 哈希表操作

    • createHashMap:分配内存,初始化桶数组。
    • put:插入元素。若键存在,计数加1;否则新建节点插入链表头部。
    • get:查询键的出现次数,遍历链表查找。
    • freeHashMap:释放哈希表所有节点内存。
  3. 输入处理

    • 使用fgets逐行读取输入,strtok分割字符串。
    • 验证数组长度是否与输入一致,避免数据错误。
  4. 核心逻辑

    • 遍历数组A,通过哈希表统计频次。
    • 遍历数组B,累加哈希表中的频次,得到总匹配数。

示例测试

示例1输入

5
4
1 2 3 4 5
4 3 2 1

输出

4

解析

  • A中每个元素出现1次。
  • B中4、3、2、1各匹配1次,总对数4。

示例2输入

6
3
1 2 4 4 2 1
1 2 3

输出

4

解析

  • A中1出现2次,2出现2次。
  • B中1和2各匹配2次,总对数4。

综合分析

  1. 时间复杂度

    • 统计频率:O(M),遍历数组A一次。
    • 匹配计算:O(N),遍历数组B一次。
    • 总复杂度:O(M + N),线性时间复杂度。
  2. 空间复杂度

    • 哈希表:O(M),存储数组A元素的频次。
    • 输入数组:O(M + N),存储原始数据。
  3. 优势

    • 高效性:避免暴力法的O(M*N)复杂度。
    • 通用性:支持任意整数(包括负数),哈希函数处理简单。
  4. 适用场景

    • 大规模数据,如M和N达到10^5级别。
    • 需要快速统计元素频次并匹配的场景。

GO

问题分析

给定两个数组A和B,统计满足A[i] == B[j]的二元组(i,j)的总个数。直接遍历所有组合的时间复杂度为O(M*N),但通过哈希表优化可以将时间复杂度降低到O(M + N)。


解题思路

  1. 哈希表统计频率:遍历数组A,用map记录每个元素出现的次数。
  2. 遍历数组B匹配:遍历数组B,对于每个元素,在哈希表中查找其出现次数并累加。

代码实现

package mainimport ("bufio""fmt""os""strconv""strings"
)func main() {// 创建输入扫描器scanner := bufio.NewScanner(os.Stdin)// 读取数组A的长度Mscanner.Scan()M, _ := strconv.Atoi(scanner.Text())// 读取数组B的长度Nscanner.Scan()N, _ := strconv.Atoi(scanner.Text())// 读取数组A的元素scanner.Scan()aLine := scanner.Text()A := strings.Fields(aLine)if len(A) != M {fmt.Println(0)return}// 读取数组B的元素scanner.Scan()bLine := scanner.Text()B := strings.Fields(bLine)if len(B) != N {fmt.Println(0)return}// 统计数组A中元素的出现次数countMap := make(map[string]int)for _, numStr := range A {countMap[numStr]++}// 计算总匹配次数total := 0for _, numStr := range B {total += countMap[numStr]}fmt.Println(total)
}

代码详细解析

  1. 输入处理

    • bufio.Scanner:创建输入扫描器逐行读取数据。
    • strconv.Atoi:将字符串转换为整数,用于读取数组长度。
    • strings.Fields:按空格分割字符串,处理数组元素。
  2. 数组验证

    if len(A) != M { ... }  // 验证数组A长度
    if len(B) != N { ... }  // 验证数组B长度
    
    • 检查分割后的元素数量是否与声明的长度一致。
  3. 哈希表统计

    countMap := make(map[string]int)
    for _, numStr := range A {countMap[numStr]++
    }
    
    • 使用字符串直接作为键(避免类型转换开销)。
    • 遍历数组A时,每个字符串元素计数+1。
  4. 匹配计算

    for _, numStr := range B {total += countMap[numStr]
    }
    
    • 遍历数组B的每个元素,累加哈希表中的出现次数。
    • 未找到时返回默认值0。

示例测试

示例1输入

5
4
1 2 3 4 5
4 3 2 1

输出

4

解析

  • A中每个元素出现1次。
  • B中的"4""3""2""1"均匹配1次,总对数4。

示例2输入

6
3
1 2 4 4 2 1
1 2 3

输出

4

解析

  • A中"1"出现2次,"2"出现2次。
  • B中的"1"匹配2次,"2"匹配2次,总对数4。

综合分析

  1. 时间复杂度

    • 统计频率:O(M),遍历数组A一次。
    • 匹配计算:O(N),遍历数组B一次。
    • 总复杂度:O(M + N),线性时间复杂度。
  2. 空间复杂度

    • 哈希表存储:O(M),存储数组A元素的字符串形式。
    • 输入存储:O(M + N),存储原始字符串数据。
  3. 性能优化

    • 直接使用字符串键:避免多次类型转换。
    • 哈希表快速查找:Go的map实现基于哈希表,平均O(1)查询时间。
  4. 适用场景

    • 适用于大规模数据(如M=1e6, N=1e6)。
    • 需要快速统计元素出现次数的场景。
    • 元素包含非数字字符的场景(如"apple")。
  5. 扩展性

    • 支持任意可哈希类型(如结构体)。
    • 可轻松修改为统计三元组、四元组等。

更多内容:

https://www.kdocs.cn/l/cvk0eoGYucWA

本文发表于【纪元A梦】,关注我,获取更多实用教程/资源!

相关文章:

华为OD机试真题——统计匹配的二元组个数(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 2025华为OD真题目录全流程解析/备考攻略/经验分享 华为OD机试真题《统计匹配…...

4.16学习总结

完成134. 加油站 - 力扣&#xff08;LeetCode&#xff09;算法题 学习了filewriter的相关方法&#xff0c;了解了字符流的底层原理...

java面试篇 4.9

目录 mybatis&#xff1a; 1、mybatis的执行流程 2、mybatis是否支持延迟加载&#xff1f; 当我们需要去开启全局的懒加载时&#xff1a; 3、mybatis的一级和二级缓存 微服务 1、springcloud五大组件有哪些 2、服务注册和发现是什么意思&#xff1f;springcloud如何实现…...

子函数嵌套的意义——以“颜色排序”为例(Python)

多一层缩进精减参数传递&#xff0c;参数少平铺书代码写更佳。 笔记模板由python脚本于2025-04-16 11:52:53创建&#xff0c;本篇笔记适合喜欢子函数嵌套结构代码形式的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&#xff0c;而不仅…...

Python深度学习实现验证码识别全攻略

放在前面 Python深度学习实现验证码识别全攻略 Python深度学习实现验证码识别全攻略 在网络安全领域&#xff0c;验证码作为人机区分的关键防线&#xff0c;广泛应用于登录、注册等场景。随着技术演进&#xff0c;验证码样式愈发复杂&#xff0c;传统识别手段力不从心&#…...

【Linux】su、su-、sudo、sudo -i、sudo su - 命令有什么区别?分别适用什么场景?

目录 su su- sudo sudo -i sudo su - /etc/sudoers su 该命令将启动非登录shell&#xff0c;即虽然以该用户身份启动shell&#xff0c;但使用的是原始用户的环境设置。普通用户账户运行 su 命令切换到另一用户账户&#xff0c;需提供要切换的账户的密码。root用户&…...

算法-同余原理

在计算n个数相加或者相乘再取余时&#xff0c;中间结果可能会溢出导致结果错误&#xff0c;这时可以使用同余原理 一、同余原理 ①加法同余 &#xff08;a[1] a[2] ... a[n]&#xff09;% m > (a[1] % m a[2] % m ... a[n] % m) % m ② 乘法同余 &#xff08;…...

深入理解卷积神经网络(CNN):从原理到实践

引言 卷积神经网络(Convolutional Neural Networks, CNN)是深度学习领域最具影响力的架构之一&#xff0c;尤其在计算机视觉任务中表现出色。自2012年AlexNet在ImageNet竞赛中一战成名以来&#xff0c;CNN不断演进&#xff0c;推动着图像识别、医疗影像分析、自动驾驶等领域的快…...

深度学习常见模块实现001

文章目录 1.学习目的2.常见模块使用与实现2.1 ResNet18实现2.2 SeNet模块2.3 CBAM模块 1.学习目的 深度学习在图像处理这块&#xff0c;很多模块已经成型&#xff0c;并没有很多新的东西&#xff0c;更多的是不同的模块堆叠&#xff0c;所以需要我们不断总结&#xff0c;动手实…...

Python实现贪吃蛇三

上篇文章Python实现贪吃蛇一&#xff0c;实现了一个贪吃蛇的基础版本。后面第二篇文章Python实现贪吃蛇二修改了一些不足&#xff0c;但最近发现还有两点需要优化&#xff1a; 1、生成食物的时候有概率和记分牌重合 2、游戏缺少暂停功能 先看生成食物的时候有概率和记分牌重合的…...

windows server C# IIS部署

1、添加IIS功能 windows server 2012、windows server 2016、windows server 2019 说明&#xff1a;自带的是.net 4.5 不需要安装.net 3.5 尽量使用 windows server 2019、2016高版本&#xff0c;低版本会出现需要打补丁的问题 2、打开IIS 3、打开iis应用池 .net 4.5 4、添…...

LLM小白自学笔记:1.两种指令微调

一、LoRA 简单来说&#xff0c;LoRA不直接调整个大模型的全部参数&#xff08;那样太费资源&#xff09;&#xff0c;而是在模型的某些层&#xff08;通常是注意力层&#xff09;加个“旁路”——两个小的矩阵&#xff08;低秩矩阵&#xff09;。训练时只更新这俩小矩阵&#x…...

杰弗里·辛顿:深度学习教父

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 杰弗里辛顿&#xff1a;当坚持遇见突破&#xff0c;AI迎来新纪元 一、人物简介 杰弗…...

RHCE 第一次作业

一.定义延迟任务 1.安装邮件服务 [roothaiou ~]# yum install s-nail -y 2.配置邮件服务 [roothaiou ~]# vim /etc/mail.rc 3.测试邮件服务 [roothaiou ~]# echo 88888888 | mail -v -s Passion 13571532874163.com 4.设置定时任务 [roothaiou ~]# crontab -e 二.时间同步…...

库洛游戏一面+二面

目录 一面 1. ArrayList和LinkedList的区别&#xff0c;就是我在插入和删除的时候他们在时间复杂度上有什么区别 2. hashmap在java的底层是怎么实现的 3. 红黑树的实现原理 4. 红黑树的特点 5. 为什么红黑树比链表查询速度快 6. 在java中字符串的操作方式有几种 7. Stri…...

基于多模态深度学习的亚急性脊髓联合变性全流程预测与个性化管理技术方案

目录 技术方案文档1. 数据收集与预处理模块2. 多模态预测模型构建3. 术前风险评估系统4. 术中实时监测系统5. 术后并发症预测与护理6. 统计分析与验证模块7. 健康教育系统技术实现说明技术方案文档 1. 数据收集与预处理模块 功能:构建数据管道,清洗并整合多源数据 伪代码示…...

蓝桥杯日期的题型

做题思路 一般分为3个步骤,首先要定义一个结构体来存储月份的天数,第一循环日期,第二判断日期是否为闰年,第三就是题目求什么 结构体 static int[] ds{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 判断是否闰年的函数 public static void f(int m,int d){//被4整…...

【树形dp题解】dfs的巧妙应用

【树形dp题解】dfs的巧妙应用 [P2986 USACO10MAR] Great Cow Gathering G - 洛谷 题目大意&#xff1a; Bessie 正在计划一年一度的奶牛大集会&#xff0c;来自全国各地的奶牛将来参加这一次集会。当然&#xff0c;她会选择最方便的地点来举办这次集会。 每个奶牛居住在 N N …...

《AI大模型应知应会100篇》第20篇:大模型伦理准则与监管趋势

第20篇&#xff1a;大模型伦理准则与监管趋势 摘要 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;尤其是大模型&#xff08;如GPT、PaLM等&#xff09;在自然语言处理、图像生成等领域的广泛应用&#xff0c;AI伦理问题和监管挑战日益凸显。本文将梳理当…...

线上教学平台(vue+springboot+ssm+mysql)含文档+PPT

线上教学平台&#xff08;vuespringbootssmmysql&#xff09;含文档PPT 该系统是一个在线教学平台&#xff0c;主要分为管理员和学员两个角色&#xff1b;管理员界面包含首页、交流中心、学员管理、资料类型管理、学习资料管理、交流论坛、我的收藏管理、留言板管理、考试管理…...

Being-0:具有视觉-语言模型和模块化技能的人形机器人智体

25年3月来自北大、北京智源和 BeingBeyond 的论文“Being-0: A Humanoid Robotic Agent with Vision-Language Models and Modular Skills”。 构建能够在现实世界具身任务中达到人类水平表现的自主机器人智体&#xff0c;是人形机器人研究的终极目标。近期&#xff0c;基于基…...

Fiddler 进行断点测试:调试网络请求

目录 一、什么是断点测试&#xff1f; 二、Fiddler 的断点功能 三、如何在 Fiddler 中设置断点&#xff1f; 步骤 1&#xff1a;启动 Fiddler 步骤 2&#xff1a;启用断点 步骤 3&#xff1a;捕获请求 步骤 4&#xff1a;修改请求或响应 四、案例&#xff1a;模拟登录失…...

决策树:ID3,C4.5,CART树总结

树模型总结 决策树部分重点关注分叉的指标&#xff0c;多叉还是单叉&#xff0c;处理离散还是连续值&#xff0c;剪枝方法&#xff0c;以及回归还是分类 一、决策树 ID3(Iterative Dichotomiser 3) 、C4.5、CART决策树 ID3:确定分类规则判别指标、寻找能够最快速降低信息熵的方…...

DDS信号发生器设计

一、基本概述 1.1 DDS简介 DDS信号发生器即直接数字频率合成&#xff08;Direct Digital Frequency Synthesis&#xff0c;简称DDS&#xff09;是一种利用数字技术生成信号的方法。它通过数字信号处理技术&#xff0c;将数字信号转换为模拟信号&#xff0c;从而生成高质量的正…...

23黑马产品经理Day01

今天过了一遍23黑马产品经理的基础视频 问题思考维度 抓住核心用户 为什么需要抓住核心用户&#xff1f; 主要原因&#xff1a;用户越来越细分&#xff0c;保持市场竞争力&#xff0c;产品开发推广更聚焦 做产品为什么要了解用户&#xff1a;了解用户的付费点&#xff0c;…...

18-21源码剖析——Mybatis整体架构设计、核心组件调用关系、源码环境搭建

学习视频资料来源&#xff1a;https://www.bilibili.com/video/BV1R14y1W7yS 文章目录 1. 架构设计2. 核心组件及调用关系3. 源码环境搭建3.1 测试类3.2 实体类3.3 核心配置文件3.4 映射配置文件3.5 遇到的问题 1. 架构设计 Mybatis整体架构分为4层&#xff1a; 接口层&#…...

东方潮流亮相广州益民艺术馆|朋克编码“艺术家潮玩”系列开幕引爆热潮

4月15日&#xff0c;由我的宇宙旗下公司朋克编码携“艺术家潮玩”系列亮相广州白云益民艺术馆&#xff0c;标志着其全国文化推广计划正式启航。本次展览围绕“潮玩艺术东方文化”展开&#xff0c;融合传统文化与当代潮流&#xff0c;以年轻化方式赋能中国文化出海。 展览现场潮…...

充电宝项目:规则引擎Drools学习

文章目录 规则引擎 Drools1 问题2 规则引擎概述2.1 规则引擎2.2 使用规则引擎的优势2.3 规则引擎应用场景2.4 Drools介绍 3 Drools入门案例3.1 创建springboot项目 引入依赖3.2 添加Drools配置类3.4 创建实体类Order3.5 orderScore.drl3.6 编写测试类 4 Drools基础语法4.1 规则…...

C++零基础实践教程 文件输入输出

模块八&#xff1a;文件输入输出 (数据持久化) 在之前的模块中&#xff0c;我们学习了如何使用程序处理数据。然而&#xff0c;当程序结束运行时&#xff0c;这些数据通常会丢失。数据持久化 (Data Persistence) 指的是将程序中的数据存储到非易失性存储介质&#xff08;如硬盘…...

SpringAI+DeepSeek大模型应用开发——1 AI概述

AI领域常用词汇 LLM&#xff08;LargeLanguage Model&#xff0c;大语言模型&#xff09; 能理解和生成自然语言的巨型AI模型&#xff0c;通过海量文本训练。例子&#xff1a;GPT-4、Claude、DeepSeek、文心一言、通义干问。 G&#xff08;Generative&#xff09;生成式: 根据上…...

数据中台进化史:从概念萌芽到价值变现的蜕变之路

在数字化转型的浪潮中&#xff0c;数据中台已成为企业驾驭数据、驱动业务创新的关键力量。回顾数据中台的发展历程&#xff0c;犹如一场从混沌到有序、从萌芽到成熟的精彩蜕变&#xff0c;它由湖仓一体、数据治理平台、数据服务平台三大核心要素逐步构建而成&#xff0c;每一个…...

【Java学习笔记】运算符

运算符 运算符的类型 算数运算符 赋值运算符 关系运算符&#xff08;比较哦啊运算符&#xff09; 逻辑运算符 三元运算符 位运算符&#xff08;需要二进制基础&#xff09; 一、算数运算符 运算符计算范例结果正号77-负号b11; -b-11加法9918-减法10-82*乘法7*856/除法9…...

【python】OpenCV—Tracking(10.6)—People Counting

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数6、参考来自 更多有趣的代码示例&#xff0c;可参考【Programming】 1、功能描述 借助 opencv-python&#xff0c;用 SSD 人形检测模型和质心跟踪方法实现对人群的计数 基于质心的跟踪可以参考 【pyt…...

JavaSE学习(前端初体验)

文章目录 前言一、准备环境二、创建站点&#xff08;创建一个文件夹&#xff09;三、将站点部署到编写器中四、VScode实用小设置五、案例展示 前言 首先了解前端三件套&#xff1a;HTML、CSS、JS HTML&#xff1a;超文本标记语言、框架层、描述数据的&#xff1b; CSS&#xf…...

智慧城市像一张无形大网,如何紧密连接你我他?

智慧城市作为复杂巨系统&#xff0c;其核心在于通过技术创新构建无缝连接的网络&#xff0c;使物理空间与数字空间深度融合。这张"无形大网"由物联网感知层、城市数据中台、人工智能中枢、数字服务入口和安全信任机制五大支柱编织而成&#xff0c;正在重塑城市运行规…...

Linux常用命令

一、history 用于显示历史命令。 history 10显示最近10条历史命令。!200使用第200行的指令。history -c清空历史记录。 二、pwd 用于显示当前绝对路径。 pwd显示当前绝对路径。 三、ls 用于以行的形式显示当前文件夹下所有内容。 ls -a显示所有内容&#xff0c;包括隐藏文…...

【AI】SpringAI 第二弹:接入 DeepSeek 官方服务

一、接入 DeepSeek 官方服务 通过一个简单的案例演示接入 DeepSeek 实现简单的问答功能 1.添加依赖 <dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-openai</artifactId> </dependency> 2…...

QT的信号槽的直接触发,队列触发,自动触发

在Qt中&#xff0c;信号槽机制是一个非常强大的特性&#xff0c;它用于实现对象之间的通信。除了默认的直接触发方式之外&#xff0c;Qt还提供了队列触发等不同的触发方式。 1. 直接触发&#xff08;Direct Connection&#xff09; 直接触发是最常见的连接方式&#xff0c;信…...

typescript html input无法输入解决办法

input里加上这个&#xff1a; onkeydown:(e: KeyboardEvent) > {e.stopPropagation();...

工厂能耗系统智能化解决方案 —— 安科瑞企业能源管控平台

安科瑞顾强 政策背景与“双碳”战略驱动 2025年《政府工作报告》明确提出“单位国内生产总值能耗降低3%左右”的目标&#xff0c;要求通过产业结构升级&#xff08;如高耗能行业技术革新或转型&#xff09;、能源结构优化&#xff08;提高非化石能源占比&#xff09;及数字化…...

栅格数据处理

一、栅格数据的引入与基本操作 &#xff08;一&#xff09;加载栅格数据 在 ArcPy 中&#xff0c;栅格数据可以通过 arcpy.Raster 类来加载。例如&#xff0c;如果你有一个存储在本地路径下的栅格数据文件&#xff08;如 GeoTIFF 格式&#xff09;&#xff0c;可以这样加载&a…...

C语言文件操作

本文重点: 什么是文件 文件名 文件类型 文件缓冲区 文件指针 文件的打开和关闭 文件的顺序读写 文件的随机读写 文件结束的判定 什么是文件 磁盘上的文件是文件。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件 程序文件 包括源程序文…...

毛笔书体检测-hog+svm python opencv源码

链接&#xff1a;https://pan.baidu.com/s/1l-bw8zR9psv1HycmMqQBqQ?pwd2ibp 提取码&#xff1a;2ibp --来自百度网盘超级会员V2的分享 1、毛笔字检测运行流程 如果解压文件发现乱码&#xff0c;可以下载Bandizip 解压文件 数据集在百度网盘里面 将文件名字改成images c…...

基于YOLOV11的道路坑洼分析系统

基于YOLOV11的道路坑洼分析系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】图形化界面与实时检测统计可视化功能 【技术栈】 ①&#xff1a;系统环境&#xff1a;Windows/MacOS/Linux多平台支持&#xff0c;推荐NVIDIA GPU加速 ②…...

【系统搭建】DPDK安装配置与helloworld运行

一&#xff0c;安装相关依赖 1. 安装依赖 sudo apt update && sudo apt install -y \build-essential libnuma-dev meson ninja-build pciutils#安装Python3与PIP3 sudo apt install python3-pip2. 升级 pip 和 setuptools sudo apt install python3-pip python3-de…...

Distortion, Animation Raymarching

这节课的主要目的是对uv进行操作&#xff0c;实现一些动画的效果&#xff0c;实际就是采样的动画 struct texDistort {float2 texScale(float2 uv, float2 scale){float2 texScale (uv - 0.5) * scale 0.5;return texScale;}float2 texRotate(float2 uv, float angle){float…...

架构风格(高软59)

系列文章目录 架构风格 文章目录 系列文章目录前言一、架构风格定义&#xff1f;二、架构风格分类总结 前言 本节讲明架构风格知识点。 一、架构风格定义&#xff1f; 二、架构风格分类 总结 就是高软笔记&#xff0c;大佬请略过&#xff01;...

免费使用RooCode + Boomerang AI + Gemini 2.5 Pro开发套件

若您正在寻找利用免费AI工具简化应用开发的方法,这份指南将为您揭开惊喜。 我们将详解如何免费整合RooCode、Boomerang AI智能代理与Google Gemini 2.5 Pro API,在Visual Studio Code中实现自动化编程加速。 这套方案能让您在几分钟内从创意跃迁至可运行原型。 套件构成与…...

《MAmmoTH2: Scaling Instructions from the Web》全文翻译

《MAmmoTH2: Scaling Instructions from the Web》 MAmmoTH2&#xff1a;从网络规模化采集指令数据 摘要 指令调优提升了大语言模型&#xff08;LLM&#xff09;的推理能力&#xff0c;其中数据质量和规模化是关键因素。大多数指令调优数据来源于人工众包或GPT-4蒸馏。我们提…...

解决Ubuntu终端命令不能补全的问题

使用命令&#xff1a; sudo vi /etc/bash.bashr 把框出的部分取消注释&#xff0c;取消后截图如下&#xff0c;保存退出&#xff1a; 使用命令env -i bash --noprofile --norc, 进行测试&#xff0c;查看tab自动补全是否可以使用。 tab键可正常使用&#xff0c; env -i bash …...