JavaRush /Java Blog /Random-JA /1 次元配列と 2 次元配列に関する問題の解決
Анзор Кармов
レベル 31
Санкт-Петербург

1 次元配列と 2 次元配列に関する問題の解決

Random-JA グループに公開済み
この記事では、配列に関連する問題を検討します (そして、より広範囲に独立した分析を提供します)。私たちは次の分野でスキルを向上させます。
  1. 1次元配列

    1. 問題「シーケンスを続行」 ;
    2. 要素検索タスク。
    3. 配列要素のソートに関する問題。
  2. 2次元配列

    1. タスク「次の形式の行列を構築する」 ;
    2. タスク「最も予期しない場所 (行、列、対角線) にある要素を見つける」 ;
    3. タスク「水上戦のために船を手配する。 」
すべての問題で、整数の配列を使用します。 1 次元および 2 次元配列の問題を解決します - 1

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. 配列内の素数の数。
値とインデックスの両方を表示できます。探している要素がない場合は、必要に応じて画面に表示します。最後のタスクでは、昇順にソートされた整数要素の配列を準備する必要があります。この配列では、最小限の操作 ( Hint ) で値によって要素を検索する必要があります。

仕分け

この一連の問題では、さまざまな並べ替えアルゴリズムを使用して整数要素の配列を並べ替える必要があります。インターネット上には、さまざまなアルゴリズムに関する資料が数多くあります。まずはアルゴリズムの本質を理解してから、自分で実装してみてください。最初は紙(ブロック図、疑似コードなど、自分に合ったもの)で作成し、次に IDEA で作成します。実装のためのアルゴリズム:
  • バブルソート;
  • 選択の並べ替え;
  • 挿入ソート;
  • マージソート。

2次元配列に関する問題

マトリックスを描く

次の一連のタスクでは、特定の方法で構成された 2 次元配列 (行列) を描画する (コンソールに出力する) 必要があります。それらは、タスクで指定されたパターンに対応する必要があります。例を挙げてみましょう。次の形式の行列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 例として、3 行目の負の要素の数を見つけてみましょう。
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
  • すべての対角要素 (左上隅から開始)。
  • すべての対角要素 (左下隅から開始)。

海戦

アスタリスクの付いた最後のセクション: ヒントや例はありません。マトリックスは海戦ゲームのプログラミングに最適です。このゲームのプログラミング段階の 1 つは、フィールド上に船を配置することです。これらの問題をいくつか解決すれば、海戦にも対処できるようになるのでご安心ください。つまり、ゼロで構成される 10x10 行列があるとします。海戦をプレイするためのフィールドだと仮定しましょう。このフィールドでは、0 は空のセル、1 は船または船の一部です。海戦ゲームのルールに従って関数をランダムに配置します。
  • 単層デッキ船 10 隻。
  • ダブルデッキコーバル10個。
  • 3階建て船5隻。
  • 海戦ゲーム用にすべての船を手配します (シングルデッキ 4 隻、ダブルデッキ 3 隻、3 デッキ 2 隻、4 デッキ 1 隻)。
それだけです!他のプログラミングのトピックと同様に、配列は実践を通じて学ぶのが最も効果的です。楽しいウォーミングアップを!
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION