CSharp (C#)

Kiểm tra 2 mảng khuyết N phần tử liên tiếp trở lên

Áp dụng để tính một số bài toán như tìm mặt hàng có n tháng liên tiếp không nhập xuất kho hay hàng hóa có n tháng liên tiếp không được bán trong khoảng thời gian nhất định, ….

Có 2 mảng A và B không trùng phần tử và mảng B luôn luôn là con của mảng A và có thứ tự sắp xếp giống nhau.
Duyệt tìm mảng A trong bảng B kiểm tra vị trí các phần tử thông qua 2 biến BeginStop.
Khởi đầu BeginStop=-1

Nếu tìm thấy phần tử ở vị trí i của mảng A trong mảng B thì gán Stop=i

Sau đó lấy Stop-Begin=1 mảng B đang liên tục trong mảng A

Còn Stop-Begin=0 là mảng không liên tục

Stop-Begin=N là mảng đang khuyết N phần tử liên tiếp.

Có 2 trường hợp đặc biệt:

Là khi mảng B không khuyết phần tử đầu tiên (vị trí 0) thì sẽ cập nhật lại biến Begin=0 nếu ngay khi vòng lặp mảng A có i bắt đầu 0 thì ta cập nhật lại Begin=0
Trường hợp 2 là từ vị trí cuối cùng của mảng B xuất hiện trong mảng A đến hết mảng A không tìm được thấy phần từ nào nữa thì khi đến cuối mảng A phải lấy i(vị trí cuối cùng mảng A)- Begin (vị trí cuối cùng của phần từ A tìm thấy trong mảng B)

Bảng test case:

using System;
static bool CheckArrrayErrorSequence(List<string> A, List<string> B, int errorSequence)
{
	int begin = -1, stop = -1;
	bool check = false;   
    if ((A.Count / errorSequence) > B.Count)//nếu phần tử mảng con quá nhỏ so với màng B thì cũng ko cần lặp
        check = true;
    if (!check)
	{
		for (int i = 0; i < A.Count; i++)
		{
			for (int j = 0; j < B.Count; j++)
			{
				if (A[i] == B[j])
				{
					if (i == 0)//nếu không khuyết phần tử đầu thì begin=0
						begin = i;
					stop = i;
					break;
				}
			}
			if (i == (A.Count - 1) && ((i - begin) > (errorSequence - 1) && stop != i))//trường hợp khuyết phần tử cuối cùng từ vị trí phần tử cuối cùng của mảng con cuối cùng xuất hiện
			{				
				check = true;
			}
			else if ((stop - begin) > errorSequence)//muốn kiểm tra mảng con khuyết bao nhiêu phàn từ liên tiếp thì sẽ lớn hơn số đó ở đây là khoảng cách vị trí liên tiếp, nhớ sửa điều kiện cho trường hợp khuyết phần tử sau cùng
			{
				check = true;
				break;
			}
			else
			{				
				begin = stop;
			}
		}
	}
	return check;
}
var start = new DateTime(2022, 10, 1);
var end = new DateTime(2023, 6, 22);

var diff = Enumerable.Range(0, Int32.MaxValue)
                     .Select(e => start.AddMonths(e))
                     .TakeWhile(e => e <= end)
                     .Select(e => e.ToString("yyyyMM"));
List<string> A = diff.ToList();
Console.Write("Array A: ");
A.ForEach(i => Console.Write(i.ToString() + ", "));
List<string> B = new List<string> { "202211",  "202302", "202303"};
Console.WriteLine();
Console.Write("Array B: ");
B.ForEach(i => Console.Write(i.ToString() + ", "));
List<string> C = new List<string> { "202211", "202212", "202301", "202302", "202303","202305"};
Console.WriteLine();
Console.Write("Array C: ");
C.ForEach(i => Console.Write(i.ToString() + ", "));
List<string> D = new List<string> { "202211", "202212"};
Console.WriteLine();
Console.Write("Array D: ");
D.ForEach(i => Console.Write(i.ToString() + ", "));
Console.WriteLine();
Console.WriteLine("Check error sequence (2) A vs B " + CheckArrrayErrorSequence(A, B, 2).ToString());
Console.WriteLine("Check error sequence (2) A vs C " + CheckArrrayErrorSequence(A, C, 2).ToString());
Console.WriteLine("Check error sequence (4) A vs D " + CheckArrrayErrorSequence(A, D, 4).ToString());
// Function to Check if array
// elements are consecutiv
// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");
Console.Read();

Có thể cái tiến bài toán thành so sánh 2 mảng có đối xứng nhau hay không? tìm các khoảng không liên tiếp giữa 2 mảng, ...

Chúc các bạn thành công và vui vẻ!

Bình luận về bài viết này