JavaRush /Java блог /Random UA /Вирішуємо завдання на одновимірні та двовимірні масиви
Анзор Кармов
31 рівень
Санкт-Петербург

Вирішуємо завдання на одновимірні та двовимірні масиви

Стаття з групи Random UA
У цій статті будуть розглянуті (а більшою мірою, дані для самостійного аналізу) завдання на масиви. Качатимемо свої скіли в наступних напрямках:
  1. Одновимірні масиви

    1. Завдання “Продовжи послідовність” ;
    2. Завдання на пошук елементів;
    3. Завдання сортування елементів масиву.
  2. Двовимірні масиви

    1. Завдання "Побудуй матрицю виду" ;
    2. Завдання "Знайди елементи в найнесподіваніших місцях (рядки, стовпці, діагоналі)" ;
    3. Завдання “Розстав кораблі для водної битви” .
Для всіх завдань ми використовуватимемо масиви цілих чисел. Розв'язуємо задачі на одновимірні та двовимірні масиви.

Завдання на одновимірні масиви

Продовж послідовність

У даному ряді завдань вам потрібно буде:
  1. Визначити закономірність, за якою формується та чи інша числова послідовність.
  2. Написати функцію, яка формує перші N елементів даної послідовності у вигляді цілісного масиву та виводить елементи масиву на екран.
Припустимо, маємо завдання продовжити наступний числовий ряд:

1, 2, 3, 4, 5…
Крок 1: Визначити закономірність. Тут все просто - це ряд натуральних чисел. Крок 2: напишемо функцію, яка формуватиме перші N елементів даного ряду у вигляді масиву:
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;
    }
}
Аналогічним чином необхідно написати функції, які б продовжабо такі послідовності:

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…

Пошук елементів

У цьому ряді завдань необхідно знайти в готовому масиві елемент, який має якісь властивості. Наприклад, максимальний за значенням елемент. Для демонстрації напишемо код функції, яка приймає масив і визначає індекс максимального елемента в масиві, а потім виводить даний елемент разом з його індексом в консоль. Також продемонструю, як за допомогою класу java.util.concurrent.ThreadLocalRandomможна швидко згенерувати цілий масив заданої довжини, що складається з випадкових елементів:
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));
    }
}
Тепер самі завдання. З масиву випадкових цілих елементів нам потрібно знайти:
  1. Максимум.
  2. Мінімум.
  3. Середнє арифметичне.
  4. Кількість елементів між максимальним та мінімальним елементом.
  5. Перше просте число.
  6. Останнє просте число.
  7. Кількість простих чисел у масиві.
Можна виводити як значення, і індекси. Якщо немає елемента, вивести це на екран, як вам зручно. Для останнього завдання необхідно підготувати відсортований за зростанням масив цілих елементів. У цьому масиві необхідно знайти елемент за значенням за мінімальну кількість операцій ( Підказка ).

Сортування

У цьому низці завдань необхідно відсортувати масив цілих елементів, використовуючи різні алгоритми сортування. Матеріалів у мережі з різних алгоритмів досить багато. Спробуйте спершу зрозуміти суть алгоритму, а потім спробуйте самостійно його реалізувати. Спочатку на папері (блок схема, псевдокод, як вам зручно), а потім у IDEA. Алгоритми для реалізації:
  • сортування бульбашкою;
  • сортування вибором;
  • сортування вставками;
  • сортування злиттям.

Завдання на двовимірні масиви

Намалюй матрицю

У наступному ряді завдань необхідно малювати (виводити в консоль) двовимірні масиви (матриці), складені певним чином: вони повинні відповідати патерну заданому завданням. Наведу приклад. Нам необхідно побудувати і вивести на екран матрицю m*n(де mкількість рядків, а nкількість елементів у рядку) виду:

1, 2, 3, 4
5, 6, 7, 8
9,10,11,12
Напишемо функцію, яка зробить все за нас, а також, наведемо функцію, яка буде гарно виводити матрицю в консоль (можливо, вона вам знадобиться):
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();
        }
    }
}
Тепер завдання: Вивести на екран матрицю m*nвиду: 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

Пошук елементів

У цьому розділі необхідно реалізувати пошук різних елементів у різних частинах матриці: у певному стовпці або у певному рядку. Припустимо, у нас є матриця виду: -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 Як приклад знайдемо кількість негативних елементів у третьому рядку:
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();
        }
    }
}
В результаті виконання методу main, в консоль буде виведено:

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 
Тепер завдання. Для будь-якого непарного nвивести матрицю n*nвиду:

1,  -2,  3,  
-4,  5, -6,
7,  -8,  9
З цієї матриці вивести:
  • усі негативні елементи;
  • всі негативні елементи у рядку i;
  • всі негативні елементи у стовпці j;
  • всі елементи діагоналі (починаючи з верхнього лівого кута);
  • всі елементи діагоналі (починаючи з нижнього лівого кута).

Морський бій

Останній розділ із зірочкою: без підказок та прикладів. Матриці ідеально підходять для програмування гри морського бою. Одним із етапів програмування цієї гри є розстановка кораблів на ігровому полі. Якщо ви вирішите ряд цих завдань, будьте впевнені, морський бій вам по зубах. Отже, дана матриця 10х10, що складається з нулів. Припустимо, що вона є полем для гри у морський бій. У цьому полі 0 - порожній осередок, 1 - корабель, або частина корабля. Написати функції, кожна з яких за правилами гри морський бій розставляє випадково:
  • 10 однопалубних кораблів;
  • 10 двопалубних корбалів;
  • 5 трипалубних кораблів;
  • розставляє всі кораблі для гри в морський бій (4 однопалубні, 3 двопалубні, 2 трипалубні, 1 чотирипалубний).
От і все! Як і з будь-якою темою у програмуванні, з масивами найкраще розбиратися на практиці. Вдалої розминки!
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ