Đếm Số Lần Xuất Hiện Của Các Phần Tử Trong Mảng C/C++

Đếm số lần xuất hiện của các phần tử trong mảng là một bài tập lập trình giúp các bạn sinh viên biết được về cấu trúc dữ liệu từ điển. Đây là bài tập đơn giản và có thể có nhiều cách giải quyết khác nhau. Tùy vào dữ liệu của bài toán, chúng ta cần có những phương pháp khác nhau để có được đáp án chính xác. 

Hãy cùng Nguyễn Văn Hiếu Blog đi tìm các cách giải khác nhau cho bài toán này nhé. Phía cuối mình sẽ có code cho mỗi cách mà mình trình bày.

  1. Phát biểu bài toán
  2. Code đếm số lần xuất hiện của các phần tử

Phát biểu bài toán

Cho một mảng 1 chiều có n phần tử. Hãy đếm số lần xuất hiện của từng phần tử trong mảng.

Ví dụ: Với n = 5 và a[] = {1, 2, 3, 1, 2}. Khi đó:

  • Số 1 xuất hiện 2 lần
  • Số 2 xuất hiện 2 lần
  • Số 3 xuất hiện 1 lần

Ý tưởng giải bài toán

Cách 1: Sử dụng chỉ số mảng làm key

Để đếm số lần xuất hiện của các phần tử trong mảng, ta cần lưu ý tới phạm vi giá trị của các phần tử trong mảng.

Nếu đề bài đảm bảo các phần tử trong mảng a[i] >= 0 và a[i] < 1000.000(1000.000 ở đây là ví dụ).

Nếu giá trị thỏa mãn không âm và nằm trong phạm vi có thể khai báo mảng bằng giá trị lớn nhất: Chẳng hạn count[1000000] cho ví dụ trên. Khi đó, ta sẽ dùng chỉ số mảng i để đếm số lần xuất hiện của giá trị i.

Ví dụ: Với n = 5 và a[] = {1, 2, 3, 1, 2}. Khi đó:

  1. a[0] = 0
  2. a[1] = 2
  3. a[2] = 2
  4. a[3] = 1

Cách 2: Sử dụng cấu trúc dữ liệu map trong C++

Với cách này, ta sẽ sử dụng cấu trúc dữ liệu map<key, value> để đếm. Khi đó value sẽ lưu số lần xuất hiện của key. Bạn xem code để hiểu cách triển khai nhé.

Cách 3: Sắp xếp, sau đó đếm

Với cách này bạn tiến hành sắp xếp mảng theo chiều tăng dần.

Code đếm số lần xuất hiện của các phần tử

Cách 1:

#include <iostream> using namespace std; const int MAX = 1e6; int cnt[MAX]; int main(){ int n; do{ cout << "nNhap n = "; cin >> n; }while(n < 1); int a[n]; for(int i = 0; i < n;i++){ do{ cout << "nNhap a[" << i << "] = "; cin >> a[i]; }while(a[i] < 0); } for(int i = 0;i < MAX; i++) cnt[i] = 0; for(int i = 0; i < n;i++){ cnt[a[i]]++; } for(int i = 0;i < MAX; i++){ if(cnt[i] > 0){ cout << "Gia tri " << i << " xuat hien " << cnt[i] << " lan!n"; } } }

Output:

Nhap n = 5 Nhap a[0] = 1 Nhap a[1] = 2 Nhap a[2] = 2 Nhap a[3] = 1 Nhap a[4] = 3 Gia tri 1 xuat hien 2 lan! Gia tri 2 xuat hien 2 lan! Gia tri 3 xuat hien 1 lan!

Cách 2:

// Lưu ý: Code sử dụng C++11 #include <iostream> #include <map> using namespace std; const int N = 1e6; int a[N]; int main(){ int n; cin >> n; map<int, int> cnt; for(int i = 0; i < n;i++){ cin >> a[i]; } for(int i = 0; i < n;i++){ cnt[a[i]]++; } for(auto it : cnt){ cout << "Gia tri " << it.first << " xuat hien " << it.second << " lan!n"; } }

Ouput:

5 1 1 2 3 4 Gia tri 1 xuat hien 2 lan! Gia tri 2 xuat hien 1 lan! Gia tri 3 xuat hien 1 lan! Gia tri 4 xuat hien 1 lan!

Cách 3:

Dưới đây mình sử dụng hàm std:::sort trong thư viện algorithm C++.

#include <iostream> #include <algorithm> using namespace std; const int N = 1e6; int a[N]; int main(){ int n; cin >> n; for(int i = 0; i < n;i++){ cin >> a[i]; } sort(a, a + n); int cnt = 1; for(int i = 1; i < n;i++){ if(a[i] == a[i-1]) ++cnt; else{ cout << "nPhan tu " << a[i-1] << " xuat hien " << cnt << " lan!"; cnt = 1; } } cout << "nPhan tu " << a[n-1] << " xuat hien " << cnt << " lan!"; }

Output:

6 1 2 3 1 2 3 Phan tu 1 xuat hien 2 lan! Phan tu 2 xuat hien 2 lan! Phan tu 3 xuat hien 2 lan!

Chúc các bạn học tốt!

Từ khóa » Hàm Main Xuất Hiện Bao Nhiêu Lần Trong C++