Rút gọn code tìm chữ số xuất hiện nhiều nhất trong ma trận

em muốn rút gọn code nó lại vì quá dài . ý tưởng rút gọn thì càng tốt :smiley:
cảm ơn mọi người vì đã xem

void DemChuSoXuatHienNN(int a[][MAX], int row, int column)
{
	int b[MAX]; // mảng chứa từng chữ số trong mảng 2 chiều
	int c[MAX]; // mảng chứa từng chữ số sau khi khoa những số trùng
	int d[MAX]; // mảng chứa số đếm
	int indexb = 0;
	int donvi;
	// B1 : Tách từng chữ số thành mảng 1 chiều
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < column; j++)
		{
			while (a[i][j] != 0)
			{
				donvi = a[i][j] % 10; // lay hang don vi
				b[indexb++] = donvi;
				a[i][j] = a[i][j] / 10; // mat di mot don vi
			}
		}
	}
	int indexc = 0;
	// Gán b[i] vào c[i]
	for (int i = 0; i < indexb; i++)
	{
		c[i] = b[i]; // gán b[i] vào c[i]
		indexc++;
	}
	// Xóa những số trùng trong mảng c[i]
	for (int i = 0; i < indexc - 1; i++)
	{
		for (int j = i + 1; j < indexc; j++)
		{
			if (c[i] == c[j])
			{
				HamXoa(c, indexc, j); // hàm xóa những số trùng
				j--;
			}
		}
	}
	// Đếm từng chữ số trong mảng c xuất hiện trog mảng d
	int indexd = 0;
	for (int i = 0; i < indexc; i++)
	{
		int dem = 0;
		for (int j = 0; j < indexb; j++)
		{
			if (c[i] == b[j])
			{
				dem++; 
				indexd++; // tang độ dài của mảng lên
			}
		}
		d[i] = dem; // gán số đếm vào mảng d
	}
	// So Sánh tìm đếm lớn nhất
	int MaxDem = d[0];
	for (int i = 1; i < indexd; i++)
	{
		if (MaxDem < d[i])
		{
			MaxDem = d[i];
			
		}
	}
	// So d cai nao bang MaxDem thi Xuat ra
	for (int  i = 0; i < indexd; i++)
	{
		if (d[i] == MaxDem)
		{
			int value = c[i]; // gán giá trị có số đếm = MaxDem vào value
			cout << "Mang co chu so xuat hien nhieu nhat la " << value << " Voi " << MaxDem << "Xuat hien " << endl;
		}
	}
}

muốn rút gọn thì thay đổi thuật toán đi, sort mảng, sau đó duyệt mảng với 2 biến là giá trị hiện tại và số lần xuất hiện, code sẽ gọn với độ phức tạp nlogn nữa!
Ps: mà hình như mảng chú là mảng 2 chiều, vậy chuyển nó về 1 chiều trước rồi làm theo ý trên!

1 Like

vâng bác tại đề bài là nhập ma trận xong tìm chữ số xuất hiện nhiều nhất . ý tưởng bác thì em hiểu , cám ơn nhé giờ em thử :smiley:

Hi Can Nguyen

  1. Bạn hãy dùng mảng 1 chiều lưu trữ ma trận như thế sẽ tiện và code cũng dễ đọc hơn. (Ma trận có thể coi là mảng hang các con trỏ cột)
  2. Đếm số phần tử trong mảng thì dùng dict để code cho nhanh. Hoặc tự cài đặt một cái danh sách liên kết đơn để tối ưu phần lưu chữ số phần tử xuất hiện trong mảng.
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?