JavaRush /Java Blog /Random-TW /解決涉及一維和二維數組的問題
Анзор Кармов
等級 31
Санкт-Петербург

解決涉及一維和二維數組的問題

在 Random-TW 群組發布
本文將考慮(並且在更大程度上提供獨立分析)涉及數組的問題。我們將在以下方面提高我們的技能:
  1. 一維數組

    1. 問題「繼續序列」
    2. 元素搜尋任務;
    3. 涉及數組元素排序的問題。
  2. 二維數組

    1. 任務「構造一個矩陣形式」
    2. 任務「在最意想不到的地方(行、列、對角線)找出元素」
    3. 任務“安排船隻進行水戰。 ”
對於所有問題,我們將使用整數數組。 解決涉及一維和二維數組的問題 - 1

涉及一維數組的問題

繼續序列

在這一系列任務中,您將需要:
  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
  • 所有對角線元素(從左上角開始);
  • 所有對角線元素(從左下角開始)。

海戰

最後一部分帶星號:沒有提示或範例。矩陣是海戰遊戲程式設計的理想選擇。遊戲的編程階段之一是將船隻放置在比賽場地上。如果你解決了一些這樣的問題,那麼你就可以放心地應對海戰了。因此,給定一個由零組成的 10x10 矩陣。假設這是一個進行海戰的場地。在此欄位中,0 是空單元格,1 是一艘船或船的一部分。編寫函數,每個函數依照海戰遊戲的規則,隨機放置:
  • 10艘單甲板船;
  • 10個雙層珊瑚;
  • 5艘三層甲板船;
  • 安排海戰比賽的所有船艦(4艘單甲板、3艘雙層、2艘三甲板、1艘四甲板)。
就這樣!與任何程式設計主題一樣,數組最好透過實踐來學習。熱身快樂!
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION