[Lập trình C] Tìm phần tử lớn thứ hai trong mảng

Wednesday, May 06, 2020
Edit this post


Với mảng cho trước bao gồm n phần tử là số nguyên, tìm phần tử lớn thứ hai trong mảng (Find second largest number in an array). Đây là một trong những câu hỏi phỏng vấn mà tôi đã từng gặp. Tìm số lớn nhất trong mảng thì hẳn ai cũng biết, nhưng số lớn thứ hai thì có thể sẽ làm kha khá bạn lúng túng.

Giải thuật với tên gọi "Find second largest number in an array" được mô tả như sau:

1) Initialize two variables first and second to INT_MIN as,
   first = second = INT_MIN
2) Start traversing the array,
   a) If the current element in array say arr[i] is greater
      than first. Then update first and second as,
      second = first
      first = arr[i]
   b) If the current element is in between first and second,
      then update second to store the value of current variable as
      second = arr[i]
3) Return the value stored in second.

Ứng với mô tả trên, cài đặt bằng C của thuật toán sẽ tương tự như sau:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <limits.h>

int main() {
    int n = 10;
    int *a = (int*) calloc(n, sizeof(int));
    
    srand(time(0));
    for (int i = 0; i < n; i++) {
        a[i] = rand() % 201;
        printf("%d ", a[i]);
    }
    
    int max, second_max;
    max = second_max = INT_MIN;
    
    for (int i = 0; i < n; i++) {
        if (a[i] > max) {
            second_max = max;
            max = a[i];
        } else if (a[i] > second_max && a[i] < max) {
            second_max = a[i];
        }
    }
    
    printf("\nmax=%d, second_max=%d", max, second_max);
    
    return 0;
}

Bonus: Cài đặt bằng Python của thuật toán:


import sys

if __name__ == '__main__':
    n = int(input())
    arr = map(int, input().split())
    
    a = list(arr)
    max = -sys.maxsize - 1
    second_max = max
    
    for i in a:
      if i > max:
        second_max = max
        max = i
      elif i < max and i > second_max:
        second_max = i
        
    print(second_max)

Chú thích:
- Tạo mảng động với n = 10 phần từ.
- Giá trị của mỗi phần tử được sinh ngẫu nhiên trong khoảng từ 0 đến 200.
- In ra phần tử lớn nhất và phần tử lớn thứ nhì, kết thúc chương trình.

Kết quả sau khi chạy chương trình (Output):

151 99 178 126 31 36 70 129 117 159
max=178, second_max=159

.
Xin vui lòng chờ đợi
Dữ liệu bài viết đang được tải về

💻Nhận dạy online 1 kèm 1 Automation Test từ cơ bản tới nâng cao (From Zero to Hero) 😁😁😁
Lộ trình gồm 3 phần:
1) Kỹ thuật lập trình và tư duy lập trình cơ bản
2) Nhập môn kiểm thử (Manual Test)
3) Kiểm thử tự động (Automation Test) + Chuẩn bị cho phỏng vấn
* Lộ trình chi tiết: Xem tại đây

🎓Đối tượng người học:
- Những bạn bị mất gốc căn bản môn lập trình.
- Những bạn muốn theo con đường kiểm thử (testing), đặc biệt là kiểm thử tự động (Automation Test).

🦘Người giảng dạy:
- Mình sẽ là người trực tiếp hướng dẫn.
- Nếu là các vấn đề ngoài chuyên môn hoặc sở trường, mình sẽ nhờ các anh chị em khác cũng làm trong ngành.

🤓Giới thiệu:
- Mình đã có hơn 10 năm kinh nghiệm làm IT ở cả trong và ngoài nước. Trong đó 3 năm đầu là làm lập trình viên Java, sau đó bén duyên với mảng Automation Test và theo nghề tới tận bây giờ. Mình được đào tạo chính quy về IT từ một trường Đại học danh tiếng ở TP.HCM (hệ kỹ sư 4 năm rưỡi), có chứng chỉ ISTQB, có thể giao tiếp tốt bằng tiếng Anh và có kinh nghiệm làm việc thực tế ở cả 2 mảng Outsource và Product. Title chính thức của mình là QA Automation Engineer, tuy nhiên, mình vẫn làm những dự án cá nhân chuyên về lập trình ứng dụng như Học Tiếng Anh StreamlineSách Nhạc. Mình là người có thái độ làm việc chuyên nghiệp, chăm chỉ và luôn nhiệt tình trong công việc.

💵Chi phí và hình thức thanh toán:
- Các bạn vui lòng liên hệ qua email songtoigianvn@gmail.com (email, chat, hoặc call) để book nội dung và khung giờ học (từ 8h tối trở đi).
- Mức phí: 150.000đ/buổi, mỗi buổi 60 phút.
- Lộ trình From Zero to Hero: 4.350.000đ (29 buổi).
- Bạn có thể học riêng và đóng tiền theo từng phần nếu muốn.
- Có thể học trước 1-2 buổi trước khi quyết định đi full lộ trình hoặc từng phần.
- Thanh toán qua Momo, chuyển khoản v.v...
BÌNH LUẬN
© Copyright by CUỘC SỐNG TỐI GIẢN
Loading...