Tổng Hợp

Đế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 hiểu rằng 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 khắc phục khác nhau. Tùy vào dữ liệu của bài toán, tất cả chúng ta phải có những phương pháp khác nhau để có được lời giải đúng đắn. 

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.

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

Cho một mảng một 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 = 5a[] = {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: Ví dụ 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 = 5a[] = {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++

Xem Thêm :   Hiệu Ứng Bokeh Là Gì ? Nhiếp Ảnh Gia Và Những Câu Chuyện Nghề Nghiệp

Xem thêm :  Tự học VBA Excel cơ bản cấp tốc FULL gồm 10 ví dụ mẫu (136 phút)

Với phương pháp này, ta sẽ sử dụng cấu trúc dữ liệu mapvàlt;key, valuevàgt; để đế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 phương pháp 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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

 

#include <iostreamvàgt;

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

=

;

i

<

n

;

i

++

)

{

        

do

{

            

cout

<

<

“nNhap a[“

<

<

i

<

<

“] = “

;

            

cin

>

>

a

[

i

]

;

        

}

while

(

a

[

i

]

<

)

;

    

}

    

for

(

int

i

=

;

i

<

MAX

;

i

++

)

cnt

[

i

]

=

;

    

for

(

int

i

=

;

i

<

n

;

i

++

)

{

        

cnt

[

a

[

i

]

]

++

;

    

}

    

for

(

int

i

=

;

i

<

MAX

;

i

++

)

{

        

if

(

cnt

[

i

]

>

)

{

            

cout

<

<

“Gia tri “

<

<

i

<

<

” xuat hien “

<

<

cnt

[

i

]

<

<

” lan!n”

;

        

}

    

}

}

 

Output:

1

2

3

4

5

6

7

8

9

10

 

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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

Xem Thêm :   What Is Natural Language Processing

Xem thêm :  Dấu hiệu nhận biết TWINFLAME

25

 

// Lưu ý: Code sử dụng C++11

#include <iostreamvàgt;

#include <mapvàgt;

using

namespace

std

;

 

const

int

N

=

1e6

;

 

int

a

[

N

]

;

 

int

main

(

)

{

    

int

n

;

    

cin

>

>

n

;

    

map

<

int

,

int

>

cnt

;

    

for

(

int

i

=

;

i

<

n

;

i

++

)

{

        

cin

>

>

a

[

i

]

;

    

}

    

    

for

(

int

i

=

;

i

<

n

;

i

++

)

{

        

cnt

[

a

[

i

]

]

++

;

    

}

    

for

(

tự động

it

:

cnt

)

{

        

cout

<

<

“Gia tri “

<

<

it

.

first

<

<

” xuat hien “

<

<

it

.

second

<

<

” lan!n”

;

    

}

}

 

Ouput:

1

2

3

4

5

6

7

 

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++.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

 

#include <iostreamvàgt;

#include <algorithmvàgt;

using

namespace

std

;

 

const

int

N

=

1e6

;

 

int

a

[

N

]

;

 

int

main

(

)

{

    

int

n

;

    

cin

>

>

n

;

    

for

(

int

i

=

;

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!”

;

    

Xem Thêm :   Mệnh lý cho người Nam sinh thời điểm giờ Hợi, Thứ Ba ngày 24

Xem thêm :  Hình ảnh thả diều trên cánh đồng ven sài gòn, đồng quê và những cánh diều

}

 

Output:

1

2

3

4

5

6

7

 

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!

Xem thêm bài viết thuộc chuyên mục: Kĩ Năng Sống

Xem thêm bài viết thuộc chuyên mục: Tổng Hợp

Related Articles

Check Also
Close
Back to top button