華為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夢】,關注我,獲取更多實用教程/資源!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/901746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/901746.shtml
英文地址,請注明出處:http://en.pswp.cn/news/901746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

半導體制造如何數字化轉型

半導體制造的數字化轉型正通過技術融合與流程重構&#xff0c;推動著這個精密產業的全面革新。全球芯片短缺與工藝復雜度指數級增長的雙重壓力下&#xff0c;頭部企業已構建起四大轉型支柱&#xff1a; 1. 數據中樞重構產線生態 臺積電的「智慧工廠4.0」部署著30萬物聯網傳感器…

[Spark]深入解密Spark SQL源碼:Catalyst框架如何優雅地解析你的SQL

本文內容組織形式 總結具體例子執行語句解析層優化層物理計劃層執行層 猜你喜歡PS 總結 先寫個總結&#xff0c;接下來會分別產出各個部分的源碼解析&#xff0c;Spark SQL主要分為以下五個執行部分。 具體例子 接下來舉個具體的例子來說明 執行語句 SELECT name, age FR…

【數據結構】4.單鏈表實現通訊錄

在上一篇文章我們學會了用單鏈表來實現各種方法&#xff0c;在這一篇文章我們將在單鏈表的基礎上實現通訊錄。 0、準備工作 實現通訊錄之前&#xff0c;我們還需要在單鏈表的基礎上添加2個文件&#xff0c;頭文件Contact.h和源文件Contact.c。Contact.c來實現通訊錄方法的聲明…

【bash】.bashrc

查看當前路徑文件數量 alias file_num"ls -l | grep ^- | wc -l"查看文件大小 alias file_size"du -sh"alias ll alias ll"ls -ltrh"cd的同時執行ll alias cdcdls; function cdls() {builtin cd "$1" && ll }自定義prompt…

微信小程序實戰案例 - 餐館點餐系統 階段 2 – 購物車

階段?2 – 購物車&#xff08;超詳細版&#xff09; 目標 把“加入購物車”做成 全局狀態&#xff0c;任何頁面都能讀寫在本地 持久化&#xff08;關閉小程序后購物車仍在&#xff09;新建 購物車頁&#xff1a;數量增減、總價實時計算、去結算入口打 Git?Tag v2.0?cart 1. …

從紅黑樹到哈希表:原理對比與典型場景應用解析(分布式以及布隆過濾器)

在數據結構的世界里&#xff0c;紅黑樹一直以「自平衡二叉查找樹」的身份備受贊譽。憑借紅黑節點的精妙設計&#xff0c;它能將插入、刪除、查找的時間復雜度穩定控制在 ( log ? n ) (\log n) (logn)&#xff0c;成為處理有序數據的經典方案。然而&#xff0c;當業務場景對「…

游戲報錯?MFC140.dll怎么安裝才能解決問題?提供多種MFC140.dll丟失修復方案

MFC140.dll 是 Microsoft Visual C 2015 運行庫的重要組成部分&#xff0c;許多軟件和游戲依賴它才能正常運行。如果你的電腦提示 "MFC140.dll 丟失" 或 "MFC140.dll 未找到"&#xff0c;說明系統缺少該文件&#xff0c;導致程序無法啟動。本文將詳細介紹 …

《電子類專業:通往科技未來的鑰匙》

一、電子類專業全景概覽 在當今科技飛速發展的時代,電子類專業無疑占據著現代科技體系中基礎與核心的重要地位。從我們日常生活中不可或缺的智能手機、電腦,到推動社會進步的人工智能、大數據技術,再到探索宇宙奧秘的航天航空設備,電子類專業的身影無處不在。它就像一把萬…

Java--批量刪除

前端部分 前端代碼主要負責收集用戶選擇的學生記錄的 id&#xff0c;并將這些 id 發送給后端的 DeleteMoreServlet 進行處理。 批量刪除按鈕綁定點擊事件 $(".deleteMore").on("click",function(){// ... }); 當用戶點擊 “批量刪除” 按鈕時&#xff…

2025年4月份生活有感

今天在5000B培訓的下午&#xff0c;一起入所來的小伙伴&#xff0c;有個申請了深圳大學的博士&#xff0c;已錄取。哎&#xff0c;想起了當年申博時候信心和決心不足&#xff0c;導致后面匆匆的拿了offer去工作。看到同事的選擇還是非常羨慕&#xff0c;想到自己5月份的婚禮&am…

數學建模學習資料免費分享:歷年賽題與優秀論文、算法課程、數學軟件等

本文介紹并分享自己當初準備數學建模比賽時&#xff0c;收集的所有資料&#xff0c;包括歷年賽題與論文、排版模板、算法講解課程與書籍、評分標準、數學建模軟件等各類資料。 最近&#xff0c;準備將自己在學習過程中&#xff0c;到處收集到的各類資料都整理一下&#xff0c;并…

關于 微服務負載均衡 的詳細說明,涵蓋主流框架/解決方案的對比、核心功能、配置示例及總結表格

以下是關于 微服務負載均衡 的詳細說明&#xff0c;涵蓋主流框架/解決方案的對比、核心功能、配置示例及總結表格&#xff1a; 1. 負載均衡的核心概念 負載均衡在微服務中用于將請求分發到多個服務實例&#xff0c;以實現&#xff1a; 高可用性&#xff1a;避免單點故障。性…

個人博客搭建過程

嘗試博客搭建,前面注冊部分很簡單&#xff0c;就不寫了&#xff0c;以我看到的一個博客為基礎&#xff0c;加上我自己的測試結束 1.官網 https://dash.infinityfree.com 前半部分參考&#xff1a; 使用Infinityfree免費虛擬主機搭建一個wordpress網站 2.創建賬戶或登錄您的…

Proxmox VE 網絡配置命令大全

如果對 Proxmox VE 全棧管理感興趣&#xff0c;可以關注“Proxmox VE 全棧管理”專欄&#xff0c;后續文章將圍繞該體系&#xff0c;從多個維度深入展開。 概要&#xff1a;Proxmox VE 網絡配置靈活&#xff0c;滿足虛擬化組網需求。基礎靠橋接實現虛擬機與物理網絡互聯&#x…

【QT入門到晉級】QT打動態庫包及引入動態庫包

前言 本篇為持續更新狀態&#xff0c;內容包含window、Linux下打動態庫包&#xff0c;以及引入動態庫包的方式。 一、window 1、動態庫打包 以百度的OCR接口調用打dll庫為例&#xff0c;以下為qtcreator創建動態庫過程&#xff1a; 1.1Qtcreator創建lib項目 創建成功后&…

Uniapp: 大綱

目錄 一、基礎鞏固1.1、Uniapp:下拉選擇框ba-tree-picker1.2、Uniapp&#xff1a;確認框1.3、Uniapp&#xff1a;消息提示框1.4、Uniapp&#xff1a;列表提示框1.5、Uniapp&#xff1a;獲取當前定位坐標 二、項目配置2.1、Uniapp&#xff1a;修改端口號2.2、Uniapp&#xff1a;…

WPF 從Main()方法啟動

1.去掉App.xaml StartupUri“MainWindow.xaml” 只會讓App.g.cs 不生成這行代碼&#xff0c;但是還是會生成的App.g.cs文件中生成Main方法 this.StartupUri new System.Uri("MainWindow.xaml", System.UriKind.Relative);默認的App.xaml的生成操作是 應用程序定義…

ADB的安裝及抓取日志(2)

三、ADB抓取日志 在使用ADB抓取日志前&#xff0c;首先要保證電腦已經安裝并配置ADB&#xff0c;在上一節已經驗證完成。連接設備&#xff1a;可通過USB或者WI-FI&#xff0c;將安卓設備與電腦連接&#xff0c;并啟用USB調試模式&#xff0c;此處我選擇的是通過電腦與安卓設備…

opencv 灰度實驗

opencv 灰度實驗 1. 最大值法2. 平均值法3. 加權均值法4(直接讀取灰度圖)cv2.IMREAD_GRAYSCALE5內置將原圖轉換為灰度圖cv2.cvtColor()6 兩個極端的灰度值 灰度圖與彩色圖最大的不同就是&#xff1a;彩色圖是由R、G、B三個通道組成&#xff0c;而灰度圖只有一個通道&#xff0c…

『Kubernetes(K8S) 入門進階實戰』實戰入門 - Pod 詳解

『Kubernetes(K8S) 入門進階實戰』實戰入門 - Pod 詳解 Pod 結構 每個 Pod 中都可以包含一個或者多個容器&#xff0c;這些容器可以分為兩類 用戶程序所在的容器&#xff0c;數量可多可少Pause 容器&#xff0c;這是每個 Pod 都會有的一個根容器&#xff0c;它的作用有兩個 可…