0
0
Lập trình
NM

Giải quyết bài toán tối đa tổng hàng trong ma trận

Đăng vào 1 ngày trước

• 4 phút đọc

Giới thiệu

Trong bài viết này, chúng ta sẽ cùng nhau khám phá cách giải quyết bài toán tối đa tổng hàng trong một ma trận và tìm khoảng cách tối đa giữa hai mảng số nguyên. Đây là một thách thức thú vị từ Perl Weekly Challenge, nơi mà kỹ năng lập trình và tư duy logic sẽ được kiểm tra. Hãy cùng tìm hiểu chi tiết về từng bài toán cũng như cách giải quyết chúng bằng ngôn ngữ lập trình Perl.

Mục tiêu

  1. Tìm tổng hàng lớn nhất trong ma trận cho trước.
  2. Tìm khoảng cách tối đa giữa bất kỳ cặp giá trị nào từ hai mảng số nguyên.

Bài toán 1: Tổng hàng lớn nhất

Đề bài

Bạn được cho một ma trận có kích thước m x n. Viết một script để tìm tổng hàng lớn nhất trong ma trận đã cho.

Ví dụ:

perl Copy
@matrix = ([4, 4, 4, 4],
            [10, 0, 0, 0],
            [2, 2, 2, 9]);

Kết quả: 16

  • Hàng 1: 4 + 4 + 4 + 4 = 16
  • Hàng 2: 10 + 0 + 0 + 0 = 10
  • Hàng 3: 2 + 2 + 2 + 9 = 15

Giải pháp

Để giải quyết bài toán này, chúng ta sẽ sử dụng các hàm tiện ích trong Perl. Đoạn mã dưới đây sẽ giúp bạn tìm tổng hàng lớn nhất:

perl Copy
use List::Util qw/sum0 max/;

sub highestRow(@matrix) {
    return max map { sum0 $_->@* } @matrix;
}

Giải thích mã:

  • map {...} @matrix: Mỗi phần tử trong @matrix là một tham chiếu đến một mảng. Chúng ta sẽ tính toán tổng cho mỗi hàng.
  • sum0 $_->@*: Giải tham chiếu một hàng ($_) để lấy danh sách các số. Sử dụng sum0 thay vì sum để xử lý trường hợp ma trận có thể rỗng.

Bài toán 2: Khoảng cách tối đa

Đề bài

Bạn được cho hai mảng số nguyên, @arr1@arr2. Viết một script để tìm khoảng cách tối đa giữa bất kỳ cặp giá trị nào từ hai mảng.

Ví dụ:

perl Copy
@arr1 = (4, 5, 7);
@arr2 = (9, 1, 3, 4);

Kết quả: 6

Giải pháp

Để tìm khoảng cách tối đa giữa hai mảng, chúng ta có thể giảm mỗi mảng về khoảng từ giá trị nhỏ nhất đến giá trị lớn nhất:

perl Copy
sub maxDist($arr1, $arr2) {
    use List::MoreUtils qw/minmax/;
    use List::Util qw/max/;

    my ($min1, $max1) = minmax($arr1->@*);
    my ($min2, $max2) = minmax($arr2->@*);

    return max( $max1 - $min2, $max2 - $min1 );
}

Giải thích mã:

  • Hàm minmax sẽ tìm giá trị nhỏ nhất và lớn nhất trong một mảng chỉ với một lần duyệt.
  • Khoảng cách tối đa sẽ là từ cực trái của một mảng đến cực phải của mảng còn lại.

Lưu ý

  • Đảm bảo kiểm tra lỗi cho trường hợp một trong hai mảng rỗng:
perl Copy
die "ERROR: empty array" if (not (@$arr1 and @$arr2));

Thực hành và Kiểm thử

Để kiểm thử mã của bạn, bạn có thể thêm các bài kiểm tra đơn vị sử dụng mô-đun Test2::V0 để đảm bảo mọi thứ hoạt động như mong đợi:

perl Copy
like( dies { maxDist([], []) }, qr/empty/i, "Empty arrays");

Mẹo và Thực hành tốt

  • Tối ưu hóa mã: Sử dụng các hàm có sẵn trong Perl để giảm thiểu độ phức tạp và tăng hiệu suất.
  • Kiểm tra lỗi: Luôn kiểm tra các điều kiện đầu vào để tránh lỗi không mong muốn.

Kết luận

Bài viết này đã hướng dẫn bạn cách giải quyết hai bài toán thú vị bằng ngôn ngữ Perl. Từ việc tính tổng hàng lớn nhất trong ma trận đến việc tìm khoảng cách tối đa giữa hai mảng, chúng ta đã áp dụng các kỹ thuật lập trình hiệu quả và mạnh mẽ. Hãy thử nghiệm và áp dụng những kiến thức này vào các dự án của bạn. Đừng quên chia sẻ trải nghiệm của bạn với cộng đồng lập trình viên!

Câu hỏi thường gặp

  1. Làm thế nào để kiểm tra mã của tôi có hoạt động không?
    • Bạn có thể sử dụng các bài kiểm tra đơn vị để kiểm tra chức năng của mã.
  2. Có những cách nào để tối ưu hóa mã của tôi?
    • Sử dụng các hàm có sẵn, tránh lặp lại tính toán và kiểm tra điều kiện đầu vào.

Tài nguyên tham khảo

Hãy bắt đầu thực hành và phát triển kỹ năng lập trình của bạn ngay hôm nay!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào