JavaRush /จาวาบล็อก /Random-TH /การแก้ปัญหาเกี่ยวกับอาร์เรย์หนึ่งมิติและสองมิติ
Анзор Кармов
ระดับ
Санкт-Петербург

การแก้ปัญหาเกี่ยวกับอาร์เรย์หนึ่งมิติและสองมิติ

เผยแพร่ในกลุ่ม
บทความนี้จะพิจารณา (และในขอบเขตที่มากขึ้น จัดให้มีการวิเคราะห์โดยอิสระ) ปัญหาที่เกี่ยวข้องกับอาร์เรย์ เราจะพัฒนาทักษะของเราในด้านต่อไปนี้:
  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. จำนวนจำนวนเฉพาะในอาร์เรย์
คุณสามารถแสดงทั้งค่าและดัชนีได้ หากไม่มีองค์ประกอบที่คุณกำลังมองหา ให้แสดงองค์ประกอบนั้นบนหน้าจอตามที่คุณต้องการ สำหรับงานสุดท้าย คุณต้องเตรียมอาร์เรย์ขององค์ประกอบจำนวนเต็มโดยเรียงลำดับจากน้อยไปหามาก ในอาร์เรย์นี้ คุณต้องค้นหาองค์ประกอบตามค่าในจำนวนการดำเนินการขั้นต่ำ ( Hint )

การเรียงลำดับ

ในชุดปัญหานี้ คุณจะต้องจัดเรียงอาร์เรย์ขององค์ประกอบจำนวนเต็มโดยใช้อัลกอริธึมการเรียงลำดับต่างๆ มีเนื้อหามากมายบนอินเทอร์เน็ตเกี่ยวกับอัลกอริธึมต่างๆ พยายามทำความเข้าใจแก่นแท้ของอัลกอริทึมก่อน แล้วจึงลองนำไปปฏิบัติด้วยตนเอง อันดับแรกบนกระดาษ (บล็อกไดอะแกรม รหัสเทียม หรืออะไรก็ได้ที่เหมาะกับคุณ) จากนั้นใน 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();
        }
    }
}
จากการดำเนินการตามวิธีการหลัก ผลลัพธ์ต่อไปนี้จะถูกส่งไปยังคอนโซล:

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