So sánh các phần tử trong 2 mảng
Show
Cho 2 mảng số nguyên A và có có n và m phần tử. Mỗi phần tử là duy nhất trong 2 mảng A và B. Tìm phần giao của 2 mảng. n, m > 0 Ví dụ Input: A[] = {1, 3, 5, 7, 8, 2}, B = {3, 4, 0, 2} Cách 1: Sử dụng vòng lặppublic class Main { public static void printUnion(int[] A, int[] B, int n, int m) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (A[i] == B[j]) System.out.print(A[i] + " "); } } } public static void main(String[] args) { int[] A = {1, 3, 5, 7, 8, 2}; int[] B = {3, 4, 0 , 2}; printUnion(A, B, A.length, B.length); } }Output: 3, 2 Độ phức tạp: O(n2) Cách 2: Sắp xếp
Output: 2, 3 Độ phức tạp: O(nlogn) Link đề bài: https://www.geeksforgeeks.org/union-and-intersection-of-two-sorted-arrays-2/ Would love your thoughts, please comment.x
mn cho em hỏi code so sánh 5 phần tử trong mảng này sai ở đâu với ạ
#include
e cảm ơn !!! Home Categories FAQ/Guidelines Terms of Service Privacy PolicyHôm nay tôi chia sẻ với anh em cách so sánh giữa 2 mảng một cách nhanh nhất mà không dùng tới vòng lặp for, while. Nhưng trước khi vào chia sẻ tôi khẳng định thế này. Nếu không dùng for, while thì chắc chắn phải dùng một cái khác thay thế rồi. Và cái thay thế cho for, while ở đây chính là Linq Tôi sẽ thực hiện việc so sánh giữa 2 mảng bằng C# và Javascript 1. So sánh giữa 2 mảng bằng ngôn ngữ C#Để thực hiện so sánh 2 mảng tôi đã viết một hàm Extension mở rộng cho IEnumerable như sau public static IEnumerableTên hàm nghĩa là từ list1 sẽ tìm tới các phần tử mới mà list2 không có. Nó tương tự như câu lệnh LEFT OUTER JOIN trong Sql Cách sử dụng trong mô phỏng bằng C# var result1 = arr1.FindNewItems(arr2, a1 => a1, a2 => a2).ToList(), var result2 = arr2.FindNewItems(arr1, a2 => a2, a1 => a1).ToList(), var result0 = arr1.Join(arr2, a1 => a1, a2 => a2, (a1, a2) => a1).ToList()Với result1 gồm phần tử chỉ xuất hiện ở mảng 1, result2 gồm chỉ phần tử xuất hiện ở mảng 2 còn result0 tôi sử dụng hàm Join Linq Object trong C# để thực hiện tìm 2 phần tử giống nhau ở 2 mảng. Như vậy chỉ với 3 dòng lệnh là tôi đã có thể so sánh nhanh chóng 2 mảng với nhau. 2. So sánh giữa 2 mảng bằng ngôn ngữ javascriptCũng tương tự như so sánh bằng C# thì ở Javascript tôi cũng sẽ dùng thư viện linq.js để thực hiện. Các bạn có thể đọc lại bài viết Thư viện Linq.js trong javascript mà tôi đã chia sẻ. Ở javascript tôi cũng viết một hàm mở rộng cho Enumerable như sau Enumerable.prototype.FindNewItems = function (list2, acc1, acc2) { return this.GroupJoin(list2, item1 => acc1(item1), item2 => acc2(item2), function (item1, list2Items) { return { item1, list2Items }; }) .Where(a => a.list2Items.Count() == 0) .Select(a => a.item1); }Tên hàm vẫn có nghĩa là list1 sẽ tìm tới các phần tử mới mà list2 không có. Rất giống với hàm tôi viết trong C# đúng không nhỉ. Cách sử dụng trong mô phỏng bằng Javascript var result1 = Enumerable.From(array1).FindNewItems(array2, item1 => item1, item2 => item2).ToArray(); var result2 = Enumerable.From(array2).FindNewItems(array1, item2 => item2, item1 => item1).ToArray(); var result0 = Enumerable.From(array1).Join(array2, item1 => item1, item2 => item2, (item1, item2) => item1).ToArray();Không khác gì với C#, tôi cũng chỉ mất có 3 dòng lệnh để so sánh 2 mảng bằng Javascript Trong thực tế phần mềm của tôi rất hay dùng tới việc so sánh này. Cụ thể là tôi thường phải lưu trữ một danh sách bản ghi vào DataBase. Ví dụ như danh sách chi tiết các sản phẩm của một đơn hàng. Lúc lưu trữ tôi sẽ so sánh danh sách chi tiết khách hàng đang nhập ở giao diện với danh sách đã có trong DataBase. Từ đó sẽ tìm ra bản ghi nào cần:
Đây chính là màn hình đơn hàng trong phần mềm của tôi Như đã nói ở tiêu đề là tôi hoàn toàn không dùng vòng lặp. Nhưng mà tôi chắc chắn rằng sẽ có các bạn bình luận rằng ở trong cái Linq thì lại chả có cả đống vòng for, while . Các bạn phải đọc rõ tiêu đề là tôi không dùng for, while còn Linq nó dùng thì tôi ko quan tâm. Cũng giống như tôi chia sẻ bài viết Code mô phỏng đèn tín hiệu giao thông bằng javascript là tôi không dùng if, else mà các bạn cứ vào comment là thư viện tôi dùng thì lại chả có if .Nói vậy thôi, anh em comment thế nào cũng được. Miễn là chúng ta cùng chia sẻ và học hỏi thôi. Chúc các bạn cuối tuần vui vẻ Sơn 20 Cùng tìm hiểu về cách so sánh mảng trong C. Bạn sẽ học được cách so sánh 2 mảng trong c sau bài học này. Có 2 phương pháp so sánh 2 mảng trong C như sau:
Lại nữa, các phương pháp này được dùng để so sánh mảng số trong C. Để so sánh 2 mảng chuỗi, bạn có thể tham khảo bài viết sau:
Logic so sánh mảng trong CĐể so sánh 2 mảng trong C, điều kiện đầu tiên là 2 mảng đó cần phải có kiểu dữ liệu giống nhau. Ví dụ chúng ta có thể so sánh một mảng có kiểu int với một mảng khác có cùng kiểu int, nhưng lại không thể so sánh với một mảng khác nữa có kiểu float chẳng hạn. Khác với khi so sánh 2 số, bạn không thể sử dụng các toán tử so sánh như = hay != với mảng trong C được. Nếu chúng ta sử dụng các toán tử so sánh để so sánh mảng, thì kết quả trả về sẽ không được như mong đợi như sau:
Kết quả: Có thể thấy trong phép so sánh thứ 3 đã không đưa ra được kết quả chính xác. Để so sánh mảng trong C, chúng ta không thể so sánh trực tiếp chúng như trên, mà cần phải so sánh từng cặp phần tử của chúng tại cùng vị trí index với nhau, hoặc là chuyển các mảng này sang dạng con trỏ của mảng, rồi tiến hành so sánh địa chỉ (address) của chúng trong bộ nhớ, với một trong 2 phương pháp mà Kiyoshi sẽ trình bày ở dưới đây. So sánh mảng trong C bằng cách đối chiếu từng cặp phần tửCách đầu tiên và đơn giản, dễ hiểu nhất để so sánh mảng trong C, đó chính là đối chiếu và kiểm tra từng cặp phần tử trong 2 mảng với nhau. Nếu tất cả các cặp phần tử với vị trí tương ứng trong 2 mảng đều giống nhau thì hai mảng đó là bằng nhau. Ngược lại chỉ cần tồn tại một cặp phần tử có giá trị khác nhau, điều đó có nghĩa là 2 mảng đã cho không giống nhau. Chúng ta sẽ sử dụng tới vòng lặp for với từng cặp phần tử và viết hàm trong chương trình so sánh mảng trong C như sau:
Kết quả phép so sánh mảng trong C: So sánh mảng trong C bằng hàm memcmpNgoài cách so sánh từng cặp phần tử trong 2 mảng như trên, chúng ta cũng có thể sử dụng hàm có sẵn memcmp để so sánh 2 mảng trong C. Hàm memcmp là một hàm trong header file string.h, vốn được sử dụng để so sánh nội dung của các vùng trên bộ nhớ với nhau. Ứng dụng hàm này, chúng ta có thể so sánh các vùng trên bộ nhớ được sử dụng để chứa các mảng, và qua đó có thể so sánh gián tiếp mảng trong C. Chúng ta sử dụng hàm memcmp với cú pháp sau đây: int memcmp(const void* s1, const void* s2, size_t size); Trong đó:
Hàm memcmp thường được sử dụng để so sánh quan hệ lớn nhỏ giữa 2 vùng trong bộ nhớ, tuy nhiên bằng cách kiểm tra giá trị trả về của nó là 0 hay là một số khác 0 thì chúng ta cũng có thể so sánh xem 2 mảng trong C có giống nhau hay không. Và chúng ta viết chương trình so sánh 2 mảng trong C bằng hàm memcmp như sau:
Kết quả phép so sánh mảng trong C: Tổng kếtTrên đây Kiyoshi đã hướng dẫn bạn cách so sánh mảng trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé. Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo. |