JavaRush /Blog Java /Random-VI /Giải các bài toán liên quan đến mảng một chiều và hai chi...
Анзор Кармов
Mức độ
Санкт-Петербург

Giải các bài toán liên quan đến mảng một chiều và hai chiều

Xuất bản trong nhóm
Bài viết này sẽ xem xét (và ở mức độ lớn hơn, cung cấp cho các phân tích độc lập) các vấn đề liên quan đến mảng. Chúng tôi sẽ cải thiện kỹ năng của mình trong các lĩnh vực sau:
  1. Mảng một chiều

    1. Vấn đề “Tiếp tục trình tự” ;
    2. Nhiệm vụ tìm kiếm phần tử;
    3. Các vấn đề liên quan đến việc sắp xếp các phần tử của mảng.
  2. Mảng hai chiều

    1. Nhiệm vụ “Xây dựng ma trận dạng” ;
    2. Nhiệm vụ “Tìm phần tử ở những vị trí không mong đợi nhất (hàng, cột, đường chéo)” ;
    3. Nhiệm vụ “Sắp xếp tàu cho trận thủy chiến . ”
Đối với tất cả các vấn đề, chúng tôi sẽ sử dụng mảng số nguyên. Giải các bài toán liên quan đến mảng một chiều và hai chiều - 1

Các bài toán liên quan đến mảng một chiều

Tiếp tục trình tự

Trong loạt nhiệm vụ này, bạn sẽ cần phải:
  1. Xác định mô hình theo đó chuỗi số này hoặc chuỗi số đó được hình thành.
  2. Viết hàm tạo N phần tử đầu tiên của một dãy cho trước dưới dạng một mảng số nguyên và hiển thị các phần tử mảng đó ra màn hình.
Giả sử chúng ta phải đối mặt với nhiệm vụ tiếp tục chuỗi số sau:

1, 2, 3, 4, 5…
Bước 1: Xác định mẫu. Mọi thứ ở đây đều cơ bản - đó là một chuỗi số tự nhiên. Bước 2: viết hàm sắp xếp N phần tử đầu tiên của một hàng nhất định dưới dạng mảng:
public class Main {

    public static void main(String[] args) {
        System.out.println(Arrays.toString(createArrayOfIntegers(10)));

        // Output: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    }

    public static int[] createArrayOfIntegers(int n) {
        int[] array = new int[n];
        for (int i = 1; i <= n; i++) {
            array[i-1] = i;
        }

        return array;
    }
}
Tương tự, cần phải viết các hàm tiếp tục các chuỗi sau:

A. 2,  4,  6,   8,  10...
B. 1,  3,  5,   7,   9...
C. 1,  4,  9,  16,  25...
D. 1,  8, 27,  64, 125...
E. 1, -1,  1,  -1,   1,  -1...
F. 1, -2,  3,  -4,   5,  -6...
G. 1, -4,  9, -16,  25....
H. 1,  0,  2,   0,   3,   0,  4....
I. 1,  2,  6,  24, 120, 720...
J. 1,  1,  2,   3,   5,   8, 13, 21…

Tìm kiếm phần tử

Trong chuỗi nhiệm vụ này, cần phải tìm một phần tử trong mảng đã hoàn thiện có một số thuộc tính. Ví dụ: phần tử có giá trị lớn nhất. Để minh họa, hãy viết mã cho một hàm nhận vào một mảng và xác định chỉ mục của phần tử lớn nhất trong mảng, sau đó xuất phần tử này cùng với chỉ mục của nó ra bảng điều khiển. Tôi cũng sẽ trình bày cách sử dụng lớp này để java.util.concurrent.ThreadLocalRandombạn có thể nhanh chóng tạo ra một mảng số nguyên có độ dài nhất định, bao gồm các phần tử ngẫu nhiên:
public class Main {

    public static void main(String[] args) {
        int[] array = generateRandomIntArray(10);
        findMax(array);

        /*
        Output:
        Generated random array: [50551934, -551646189, 410352642, 1822778873, -1744293692, -1140287711, 878876868, -2116893120, -797503442, -703924530]
        Max element is [1822778873] with index [3]
        */

    }


    public static int[] generateRandomIntArray(int n) {
        int[] array = ThreadLocalRandom.current().ints().limit(n).toArray();
        System.out.println("Generated random array: " + Arrays.toString(array));
        return array;
    }

    public static void findMax(int[] array) {
        int maxIndex = 0;
        int max = array[maxIndex];
        for (int i = 1; i < array.length; i++) {
            if (array[i] > max) {
                max = array[i];
                maxIndex = i;
            }
        }

        System.out.println(String.format("Max element is [%d] with index [%d]", max, maxIndex));
    }
}
Bây giờ là nhiệm vụ của chính họ. Từ một mảng các phần tử nguyên ngẫu nhiên, chúng ta cần tìm:
  1. Tối đa.
  2. Tối thiểu.
  3. Trung bình.
  4. Số phần tử giữa phần tử lớn nhất và nhỏ nhất.
  5. Số nguyên tố đầu tiên.
  6. Số nguyên tố cuối cùng.
  7. Số số nguyên tố trong mảng.
Bạn có thể hiển thị cả giá trị và chỉ số. Nếu không có thành phần nào bạn đang tìm kiếm, hãy hiển thị nó trên màn hình một cách thuận tiện. Đối với nhiệm vụ cuối cùng, bạn cần chuẩn bị một mảng các phần tử số nguyên được sắp xếp theo thứ tự tăng dần. Trong mảng này, bạn cần tìm một phần tử theo giá trị trong một số thao tác tối thiểu ( Gợi ý ).

Sắp xếp

Trong loạt bài tập này, bạn cần sắp xếp một mảng các phần tử số nguyên bằng nhiều thuật toán sắp xếp khác nhau. Có khá nhiều tài liệu trên Internet về các thuật toán khác nhau. Trước tiên, hãy cố gắng hiểu bản chất của thuật toán, sau đó thử tự mình thực hiện nó. Đầu tiên là trên giấy (sơ đồ khối, mã giả, bất cứ thứ gì phù hợp với bạn), sau đó là trong IDEA. Các thuật toán để thực hiện:
  • sắp xếp bong bóng;
  • sắp xếp lựa chọn;
  • sắp xếp chèn;
  • sắp xếp hợp nhất.

Các vấn đề liên quan đến mảng hai chiều

Vẽ một ma trận

Trong chuỗi nhiệm vụ tiếp theo, cần vẽ (xuất ra bảng điều khiển) các mảng (ma trận) hai chiều được cấu tạo theo một cách nhất định: chúng phải tương ứng với mẫu được chỉ định bởi nhiệm vụ. Tôi sẽ cho bạn một ví dụ. Chúng ta cần xây dựng và hiển thị một ma trận m*n(trong đó mlà số hàng và nsố phần tử trong hàng) của biểu mẫu:

1, 2, 3, 4
5, 6, 7, 8
9,10,11,12
Hãy viết một hàm sẽ làm mọi thứ cho chúng ta, đồng thời đưa ra một hàm sẽ xuất ma trận một cách đẹp mắt ra bảng điều khiển (bạn có thể thấy nó hữu ích):
public class Main {

    public static void main(String[] args) {
        createAndDrawMatrix(3, 4);

    }

    public static void createAndDrawMatrix(int m, int n) {
        int[][] matrix = new int[m][n];

        int value = 1;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                matrix[i][j] = value;
                value ++;
            }
        }

        printMatrix(matrix);
    }

    public static void printMatrix(int[][] matrix) {
        for (int[] array : matrix) {
            for (int anInt : array) {
                System.out.print(String.format("%3d", anInt));
            }
            System.out.println();
        }
    }
}
Nhiệm vụ bây giờ: Hiển thị ma trận m*ncó dạng: 4, 3, 2, 1 8, 7, 6, 5, 12,11,10, 9 ----------- 1, 4, 7 2, 5, 8 3, 6, 9 ----------- 9, 8, 7 6, 5, 4 3, 2, 1 ----------- 12,11,10, 9 8, 7, 6, 5, 4, 3, 2, 1

Tìm kiếm phần tử

Trong phần này, cần thực hiện tìm kiếm các phần tử khác nhau trong các phần khác nhau của ma trận: trong một cột cụ thể hoặc trong một hàng cụ thể. Giả sử chúng ta có một ma trận có dạng: -1 2 -3 4 -5 6 -7 8 -9 10 -11 12 -13 14 -15 16 -17 18 -19 20 -21 22 -23 24 -25 26 -27 28 -29 30 -31 32 -33 34 -35 Ví dụ: hãy tìm số phần tử âm ở hàng thứ ba:
public class Main {

    public static void main(String[] args) {
        int [][] matrix = {
                { -1,   2,   -3,    4,   -5,    6,   -7},
                {  8,  -9,   10,  -11,   12,  -13,   14},
                {-15,  16,  -17,   18,  -19,   20,  -21},
                { 22, -23,   24,  -25,   26,  -27,   28},
                {-29,  30,  -31,   32,  -33,   34,  -35}
        };

        findNegativeCountInRow(matrix, 3);
    }

    private static void findNegativeCountInRow(int[][] matrix, int rowNumber) {
        int negativeCount = 0;
        for (int element : matrix[rowNumber]){
            if (element < 0) {
                negativeCount ++;
            }
        }

        System.out.println("Matrix: ");
        printMatrix(matrix);
        System.out.println(String.format("Has %d negative elements in #%d row ", negativeCount, rowNumber));

    }

    public static void printMatrix(int[][] matrix) {
        for (int[] array : matrix) {
            for (int anInt : array) {
                System.out.print(String.format("%5d", anInt));
            }
            System.out.println();
        }
    }
}
Kết quả của việc thực thi phương thức chính, kết quả sau sẽ được xuất ra bàn điều khiển:

Matrix: 
   -1    2   -3    4   -5    6   -7
    8   -9   10  -11   12  -13   14
  -15   16  -17   18  -19   20  -21
   22  -23   24  -25   26  -27   28
  -29   30  -31   32  -33   34  -35
Has 3 negative elements in #3 row 
Bây giờ là nhiệm vụ. Đối với bất kỳ số lẻ nào, nhãy in một ma trận n*ncó dạng:

1,  -2,  3,  
-4,  5, -6,
7,  -8,  9
Từ ma trận này, suy ra:
  • tất cả các yếu tố tiêu cực;
  • tất cả các phần tử âm trong chuỗi i;
  • tất cả các phần tử âm trong cột j;
  • tất cả các phần tử đường chéo (bắt đầu từ góc trên bên trái);
  • tất cả các phần tử đường chéo (bắt đầu từ góc dưới bên trái).

Trận đánh trên biển

Phần cuối cùng có dấu hoa thị: không có mẹo hoặc ví dụ. Ma trận là lý tưởng để lập trình trò chơi trận chiến trên biển. Một trong những giai đoạn lập trình của trò chơi này là việc sắp xếp các con tàu trên sân chơi. Nếu bạn giải quyết được một số vấn đề này, hãy yên tâm rằng bạn sẽ có thể đương đầu với trận hải chiến. Vì vậy, cho một ma trận 10x10 bao gồm các số 0. Giả sử đó là một sân chơi hải chiến. Trong trường này, 0 là ô trống, 1 là con tàu hoặc một phần của con tàu. Viết các hàm, mỗi hàm theo quy tắc của trò chơi chiến đấu trên biển, đặt chúng một cách ngẫu nhiên:
  • 10 tàu một tầng;
  • 10 con san hô hai tầng;
  • 5 tàu ba tầng;
  • bố trí đầy đủ các loại tàu phục vụ trò chơi hải chiến (4 boong đơn, 3 boong đôi, 2 tàu ba boong, 1 tàu bốn boong).
Đó là tất cả! Như với bất kỳ chủ đề lập trình nào, mảng được học tốt nhất thông qua thực hành. Chúc mừng khởi động!
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION