Tìm số lớn thứ hai trong một danh sách các số nguyên.
Tự học Cấu trúc dữ liệu và giải thuật với Python


Danh sách bài học
Tìm số lớn thứ hai trong một danh sách các số nguyên.
Yêu cầu bài toán
Viết một chương trình Python để tìm số lớn thứ hai trong một danh sách các số nguyên.
Định hướng cách làm
Để giải quyết bài toán tìm phần tử lớn thứ hai trong danh sách đã cho, ta có thể sử dụng cách tiếp cận sau:
- Tạo một danh sách các số nguyên.
- Kiểm tra xem danh sách có ít nhất hai phần tử hay không. Nếu không, trả về
None
. - Tìm số lớn nhất trong danh sách bằng cách duyệt qua từng phần tử và so sánh với biến lưu giá trị lớn nhất hiện tại.
- Xóa số lớn nhất khỏi danh sách.
- Tìm số lớn nhất trong danh sách đã xóa bằng cách duyệt qua từng phần tử và so sánh với biến lưu giá trị lớn nhất hiện tại.
- Trả về giá trị lớn nhất thứ hai.
Testcase
- Test case 1: Trường hợp danh sách rỗng hoặc chỉ chứa một phần tử
numbers = []
second_largest = find_second_largest(numbers)
print(second_largest) # None
numbers = [5]
second_largest = find_second_largest(numbers)
print(second_largest) # None
- Test case 2:Trường hợp danh sách chứa đúng hai phần tử
numbers = [4, 7]
second_largest = find_second_largest(numbers)
print(second_largest) # 4
- Test case 3:Trường hợp danh sách chứa nhiều hơn hai phần tử và số lớn thứ hai xuất hiện ở giữa danh sách
numbers = [3, 7, 1, 9, 4, 5]
second_largest = find_second_largest(numbers)
print(second_largest) # 7
- Test case 4: Trường hợp danh sách chứa nhiều hơn hai phần tử và số lớn thứ hai xuất hiện ở cuối danh sách
numbers = [1, 4, 6, 2, 8, 10]
second_largest = find_second_largest(numbers)
print(second_largest) # 8
- Test case 5: Trường hợp danh sách chứa nhiều hơn hai phần tử và tất cả các phần tử đều bằng nhau
numbers = [2, 2, 2, 2, 2]
second_largest = find_second_largest(numbers)
print(second_largest) # 2
- Test case 6: Trường hợp danh sách chứa nhiều hơn hai phần tử và tất cả các phần tử đều âm
numbers = [-3, -5, -2, -1, -4]
second_largest = find_second_largest(numbers)
print(second_largest) # -2
Source code tham khảo
def find_second_largest(numbers):
# Kiểm tra danh sách có ít nhất hai phần tử
if len(numbers) < 2:
return None
# Tìm số lớn nhất trong danh sách
max_number = float('-inf')
for number in numbers:
if number > max_number:
max_number = number
# Xóa số lớn nhất khỏi danh sách
numbers.remove(max_number)
# Tìm số lớn nhất thứ hai trong danh sách đã xóa
second_max_number = float('-inf')
for number in numbers:
if number > second_max_number:
second_max_number = number
# Trả về số lớn nhất thứ hai
return second_max_number
Kết luận
Mặc dù bài giảng được hướng dẫn với ngôn ngữ python nhưng bạn hoàn toàn có thể diễn đạt bài toán này bằng các ngôn ngữ C++, C#, Java, ... một cách tương tự.
Nếu bạn có cách làm hiệu quả hơn / tối ưu hơn, hoặc cách diễn đạt dễ hiểu hơn hãy để lại source code hoặc hướng dẫn bên dưới bình luận để mọi người có thể tham khảo và học hỏi thêm.
Tải xuống
Tài liệu
Nhằm phục vụ mục đích học tập Offline của cộng đồng, Kteam hỗ trợ tính năng lưu trữ nội dung bài học Tìm số lớn thứ hai trong một danh sách các số nguyên. dưới dạng file PDF trong link bên dưới.
Ngoài ra, bạn cũng có thể tìm thấy các tài liệu được đóng góp từ cộng đồng ở mục TÀI LIỆU trên thư viện Howkteam.com
Đừng quên like và share để ủng hộ Kteam và tác giả nhé!

Thảo luận
Nếu bạn có bất kỳ khó khăn hay thắc mắc gì về khóa học, đừng ngần ngại đặt câu hỏi trong phần bên dưới hoặc trong mục HỎI & ĐÁP trên thư viện Howkteam.com để nhận được sự hỗ trợ từ cộng đồng.
Nội dung bài viết
Tác giả/Dịch giả

Nhà sáng lập Howkteam.com, KQuiz.vn & tác giả các khóa học C#, Auto, Unity3D, Python....
Với mong muốn mang đến kiến thức chất lượng, miễn phí cho mọi người, với tâm huyết phá bỏ rào cản kiến thức từ việc giáo dục thu phí. Tôi đã cùng đội ngũ Kteam đã lập nên trang website này để thế giới phẳng hơn.
Hãy cùng chúng tôi lan tỏa kiến thức đến cộng đồng!
Khóa học
Tự học Cấu trúc dữ liệu và giải thuật với Python
Giới thiệu khóa học
Là một trong những ngôn ngữ được sử dụng phổ biến nhất trên thế giới, Python sở hữu cộng đồng người dùng khổng lồ và là công cụ đắc lực của rất nhiều lập trình viên nhờ sức hút đến từ sự dễ hiểu, tiện lợi và vô cùng linh hoạt. Áp dụng trong nhiều lĩnh vực từ đơn giản đến phức tạp: xây dựng các trang web và phát triển phần mềm, sử dụng Python trong Machine learning & Data science, xây dựng các model AI với python....
Cấu trúc dữ liệu và giải thuật là một bộ môn nền tảng và có ý nghĩa vô cùng quan trọng đối với các lập trình viên, nó cung cấp cho chúng ta các kiến thức và kỹ năng cần thiết để có thể lưu trữ và thao tác với dữ liệu một cách hiệu quả. Việc nắm vững bộ môn này sẽ giúp cho chúng ta dễ dàng tiếp cận với các kiến thức mới ở mức độ khó hơn, cũng như là cải thiện khả năng tư duy thực chiến.
Cấu trúc dữ liệu và giải thuật, như tên của mình, thì bao gồm hai thành phần:
-
Cấu trúc dữ liệu: chính là thứ mà ta dùng để lưu trữ dữ liệu trong máy tính. Từ những loại cấu trúc dữ liệu đơn giản như là số, chuỗi hay là mảng, thì chúng ta sẽ cải biến chúng nhằm lưu trữ các dạng dữ liệu phức tạp hơn như là cây, đồ thị hay là danh sách liên kết.
-
Giải thuật: là các phương pháp, cách thức mà ta sẽ dùng để xử lý các vấn đề. Thuần thục được các thuật toán sẽ giúp chúng ta cải thiện được khả năng tư duy và có thể xử lý được vấn đề theo cách hiệu quả và tối ưu.
Trong khóa học này, Kteam sẽ cung cấp cho các bạn những kiến thức cơ bản và là nền tảng của bộ môn cấu trúc dữ liệu và giải thuật, với loại ngôn ngữ lập trình chính mà ta sử dụng là python.
Từ khóa học này, các bạn hoàn toàn có thể đủ tự tin và kiến thức để tiếp cận những kiến thức của bộ môn cấu trúc dữ liệu và giải thuật ở trình độ cao hơn.
Đối tượng tham gia
Các bạn sẽ cần nắm vững được những kiến thức cơ bản về cú pháp và các thao tác cơ bản với python. Bên cạnh đó, cũng sẽ cần một chút kiến thức toán học cơ bản để đảm bảo rằng bạn có thể nắm vững kiến thức của khóa học.
Nếu các bạn là một người mới bắt đầu học python thì hoàn toàn có thể học song song hai khóa học, để vừa có thể củng cố kiến thức với python, vừa tiếp thu thêm được các kiến thức về cấu trúc dữ liệu và giải thuật.
Kiến thức truyền tải
Trong khóa học, bạn sẽ được tiếp cận đến các nhóm kiến thức như sau:
-
Cấu trúc dữ liệu
Kteam sẽ gửi đến các bạn các kiến thức về các loại cấu trúc dữ liệu thú vị như là danh sách liên kết, đồ thị, cây, và heap. Đây là những loại cấu trúc dữ liệu khá dễ hiểu và từ những loại cấu trúc dữ liệu này, các bạn có thể tìm hiểu về các loại cấu trúc dữ liệu đặc thù hơn, ví dụ như là Fibonacci heap, cây AVL, ...
-
Giải thuật
Trong nội dung khóa học, bạn sẽ được cung cấp các kiến thức về các kỹ thuật để xử lý bài toán. Từ những kỹ thuật như là phương pháp sinh, nhánh cận cho tới những kỹ thuật mạnh mẽ hơn như là quy hoạch động, tất cả đều sẽ có ở trong nội dung của khóa học.
-
Toán học
Toán học cũng là một phần đóng vai trò quan trọng trong bộ môn cấu trúc dữ liệu và giải thuật. Việc nắm vững các kiến thức về toán học sẽ giúp ta dễ dàng hơn trong việc xử lý các vấn đề của bộ môn này. Và, toán học cũng sẽ giúp các bạn cải thiện khả năng tư duy. Trong nội dung của khóa học, chúng mình sẽ không đi quá sâu về toán mà chỉ đề cập đến những thành phần cơ bản. Các bạn có thể xem những kiến thức mà tụi mình đề cập như là một “keyword” để các bạn có thể tìm hiểu thêm về những đơn vị toán đó.
Cấu trúc khóa học
Khóa học sẽ gửi đến các bạn một lượng kiến thức lớn và được truyền tải xuyên suốt các bài của khóa. Để các bạn có thể dễ dàng hơn trong cách tiếp cận nội dung, thì các bài trong khóa sẽ được chia thành ba dạng:
-
Dạng A: Bao gồm các bài có nội dung là phần giới thiệu về những mảng kiến thức cố định. Các bài này sẽ cung cấp cho các bạn cái nhìn tổng quan nhất về đơn vị kiến thức thuộc một chủ đề nhất định. Ví dụ: với bài “Giới thiệu về đồ thị”, thì Kteam sẽ giới thiệu cho các bạn những khái niệm sơ khai nhất liên quan đến đồ thị như là đỉnh, cạnh, đường đi, chu trình, ...
-
Dạng B: Gồm các bài tập có liên quan đến những chủ đề được giới thiệu trong bài A. Các bài này là những bài tập đi kèm giúp các bạn có khả năng sử dụng những kiến thức thu được từ các bài A và C để áp dụng vào việc xử lý một bài toán nào đó.
-
Dạng C: Các bài thuộc dạng này sẽ là những bài mà chúng ta sẽ cùng nhau đi sâu hơn về những chủ đề được giới thiệu ở bài A. Ví dụ như liên quan đến lý thuyết đồ thị, chúng ta sẽ có những kiến thức sâu hơn như là tìm kiếm đường đi trong đồ thị, tìm cây khung nhỏ nhất, ....
Về tác giả
Khóa học này được biên soạn bởi Nông Thanh Toàn. Tuy không phải là chuyên gia về lập trình và giải thuật, nhưng tác giả lại đam mê và mong muốn phát triển bản thân thông qua việc tìm hiểu và chia sẻ kiến thức. Với tinh thần này, tác giả đã tạo ra khóa học để chia sẻ kiến thức của mình với những người mới bắt đầu học lập trình và đang muốn tiếp cận với bộ môn cấu trúc dữ liệu và giải thuật.
Đánh giá
