Bài tập - Trả về mảng từ các phương pháp

Đã hoàn thành

Khi phát triển các ứng dụng, bạn thường cần phải xây dựng và sửa đổi tập hợp dữ liệu. Các phương pháp rất hữu ích để thực hiện các thao tác trên dữ liệu và chúng đặc biệt mạnh mẽ để tự xây dựng các tập dữ liệu. Phát triển các phương pháp để tạo mảng đại diện cho tập dữ liệu của bạn giúp giữ cho mã của bạn có thể tái sử dụng, sắp xếp và đơn giản hóa. Trong bài tập này, bạn sẽ thực hành trả về mảng từ các phương pháp.

Tìm đồng tiền để thực hiện thay đổi

Giả sử bạn có một vài đồng tiền các giá trị khác nhau. Bạn có nhiệm vụ tìm hai đồng tiền có tổng bằng một giá trị mục tiêu. Trong bài tập này, các đồng tiền có sẵn được thể hiện trong một mảng số nguyên. Bạn sẽ cần trả về các chỉ số của hai đồng tiền trong một mảng mới. Hãy bắt đầu!

  1. Trong Trình soạn thảo Mã Visual Studio, xóa bất kỳ mã hiện có nào khỏi các bài tập trước đó.

  2. Nhập mã sau đây vào Trình soạn thảo Mã Visual Studio:

    int[] TwoCoins(int[] coins, int target) 
    {
        return  new int[0];
    }
    

    Trong trường hợp không tìm thấy hai đồng tiền, phương pháp của bạn trả về một mảng trống. Dành chút thời gian để xem xét cú pháp của kết quả trả về. Mặc dù bạn có thể tạo biến số để lưu trữ int[] mảng mới và trả về biến số, return câu lệnh cho phép bạn đồng thời tạo và trả về các giá trị.

  3. Có nhiều cách tiếp cận để giải quyết vấn đề này. Dành chút thời gian để cân nhắc cách bạn có thể tìm kiếm hai số trong một mảng có tổng bằng một giá trị đã cho.

    Trong bài tập này, cách tiếp cận sau đây sẽ được sử dụng:

    1. Chọn một số từ mảng
    2. Kiểm tra từng số khác một để xem chúng có cộng với giá trị đích không
    3. Trả về kết quả ngay khi tìm thấy kết quả khớp
  4. Để kiểm tra từng số trong mảng, hãy cập nhật phương TwoCoins pháp với mã sau đây:

    int[] TwoCoins(int[] coins, int target) 
    {
        for (int curr = 0; curr < coins.Length; curr++) 
        {
            for (int next = curr + 1; next < coins.Length; next++) 
            {
    
            }
        }
    
        return  new int[0];
    }
    

    Tại đây, curr đại diện cho một chỉ số đồng xu cố định và next đại diện cho các chỉ số xu tiếp theo. Bạn sẽ thử thêm từng đồng xu next với đồng tiền cố định curr để xem chúng có bằng giá trị đích không.

  5. Tiếp theo, thêm lô-gic để kiểm tra tổng của hai đồng tiền cho giá trị đích. Để thực hiện điều này, hãy cập nhật for các vòng lặp trước đó bằng mã sau đây:

    for (int curr = 0; curr < coins.Length; curr++) 
    {
        for (int next = curr + 1; next < coins.Length; next++) 
        {
            if (coins[curr] + coins[next] == target) 
            {
                return new int[]{curr, next};
            }
    
        }
    }
    

    Trong mã này, bạn đang kiểm tra xem tổng các giá trị tại currnext và trong mảng có bằng giá trị đích hay không. Nếu tổng bằng nhau, bạn tạo một mảng để lưu trữ các chỉ số đó và trả về nó. Nếu chúng không bằng nhau, bạn có thể bỏ qua chúng và tiếp tục kiểm tra.

Kiểm tra giải pháp của bạn

Trong bước này, bạn sẽ kiểm tra mã của mình để đảm bảo mã đang chạy chính xác. Trước tiên, bạn sẽ khởi tạo một số biến số để lưu trữ dữ liệu đầu vào, sau đó bạn sẽ gọi phương pháp và in kết quả.

  1. Tạo một dòng mã trống mới ở trên chữ ký TwoCoins phương thức. Sau đó, nhập mã sau:

    int target = 60;
    int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5};
    int[] result = TwoCoins(coins, target);
    

    Hãy nhớ rằng phương TwoCoins pháp trả về một mảng trống nếu không tìm thấy thay đổi nào. Bạn sẽ cần kiểm tra kích cỡ mảng trước khi tìm cách in mảng result .

  2. Nhập một dòng mã trống mới. Sau đó, nhập mã sau:

    if (result.Length == 0) 
    {
        Console.WriteLine("No two coins make change");
    } 
    else 
    {
        Console.WriteLine($"Change found at positions {result[0]} and {result[1]}");
    }
    
  3. Nếu cần, hãy mở pa-nen Đầu cuối Tích hợp của Visual Studio Code.

  4. Tại dấu nhắc lệnh Terminal, hãy nhập dotnet run. So sánh đầu ra của bạn với các mục sau:

    Change found at positions 2 and 5
    

    Nếu mã của bạn hiển thị kết quả không mong muốn, bạn cần phải xem lại mã của mình để tìm lỗi và cập nhật. Chạy lại mã để xem bạn đã khắc phục sự cố chưa. Tiếp tục cập nhật và chạy mã của bạn cho đến khi mã của bạn tạo ra kết quả mong đợi.

Tìm nhiều cặp tiền xu thực hiện thay đổi

Trong bước này, bạn sẽ mở rộng phương TwoCoins pháp để tìm thêm các cặp tiền xu có tổng bằng với giá trị mục tiêu. Đối với bài tập này, bạn sẽ tìm thấy tối đa năm cặp. Điều này có nghĩa là kiểu trả về sẽ là mảng 2D thay vì mảng 1D và bạn sẽ cần sửa đổi cách mã trả về kết quả. Hãy bắt đầu!

  1. Thay đổi kiểu trả về trong chữ ký phương thức từ đó int[] bằng int[,] cách cập nhật mã của bạn thành như sau:

    int[,] TwoCoins(int[] coins, int target)
    

    Tiếp theo, bạn sẽ tạo int[,] một mảng để lưu trữ và trả về kết quả của mình và biến số bộ đếm để theo dõi số cặp được thêm vào mảng.

  2. Cập nhật phương TwoCoins với mã sau:

    int[,] TwoCoins(int[] coins, int target) 
    {
        int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}};
        int count = 0;
    

    Lưu ý rằng bạn đã khởi tạo các thành phần mảng kết quả thành -1. Điều này sẽ giúp bạn sau này khi bạn muốn in các cặp được tìm thấy.

    Tiếp theo, bạn sẽ sử dụng mảng để lưu result trữ từng cặp tìm thấy thay vì trả về kết quả khớp đầu tiên.

  3. Cập nhật phương TwoCoins với mã sau:

    int[,] TwoCoins(int[] coins, int target) 
    {
        int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}};
        int count = 0;
    
        for (int curr = 0; curr < coins.Length; curr++) 
        {
            for (int next = curr + 1; next < coins.Length; next++) 
            {
                if (coins[curr] + coins[next] == target) 
                {
                    result[count, 0] = curr;
                    result[count, 1] = next;
                    count++;
                }
    
            }
        }
    

    Lưu ý count rằng cặp được tăng dần mỗi khi một cặp được thêm vào mảng. Điều này có thể gây ra lỗi chỉ mục ngoài giới hạn nếu tìm thấy nhiều hơn năm cặp. Để tránh lỗi này, bạn có thể thêm mã count để kiểm tra giá trị và trả về kết quả result của mảng được điền.

  4. Cập nhật lô-gic trong TwoCoins phương pháp bằng mã sau đây:

    for (int next = curr + 1; next < coins.Length; next++) 
    {
        if (coins[curr] + coins[next] == target) 
        {
            result[count, 0] = curr;
            result[count, 1] = next;
            count++;
        }
        if (count == result.GetLength(0)) 
        {
            return result;
        }
    }
    

    Cuối cùng, bạn sẽ cần cập nhật câu lệnh trả về cuối cùng để trả về kết quả chính xác nếu không tìm thấy kết quả khớp nào hoặc nếu tìm thấy ít hơn năm kết quả khớp.

  5. Dẫn hướng đến câu return lệnh trong phương TwoCoins thức. Sửa đổi câu return lệnh để khớp với mã sau:

    if (count == 0) 
    {
        return new int[0,0];
    }
    return result;
    

    Bạn cũng có thể rút ngắn mã trả về này bằng cách sử dụng toán tử thứ ba như sau:

    return (count == 0) ? new int[0,0] : result;
    

    Quan trọng

    Tính linh hoạt của từ return khóa cho phép bạn trả về giá trị của biểu thức, miễn là kết quả khớp với loại trả về đã xác định của phương thức.

  6. Tại thời điểm này, phương TwoCoins pháp phải phù hợp với mã sau đây:

    int[,] TwoCoins(int[] coins, int target) 
    {
        int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}};
        int count = 0;
    
        for (int curr = 0; curr < coins.Length; curr++) 
        {
            for (int next = curr + 1; next < coins.Length; next++) 
            {
                if (coins[curr] + coins[next] == target) 
                {
                    result[count, 0] = curr;
                    result[count, 1] = next;
                    count++;
                }
                if (count == result.GetLength(0)) 
                {
                    return result;
                }
            }
        }
        return (count == 0) ? new int[0,0] : result;
    }
    

Chụp mảng trả về mới

Bây giờ, phương pháp của bạn đang trả về mảng 2D, bạn có thể cập nhật mã của mình để truy xuất và in kết quả. Vì các thành phần mảng kết quả được khởi tạo thành -1, bạn có thể thêm kiểm tra để in tất cả các cặp cho đến khi tìm -1 thấy giá trị.

  1. Điều hướng đến phần đầu của chương trình nơi biến target được xác định. Sửa đổi mã của bạn như sau:

    int target = 30;
    int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5};
    int[,] result = TwoCoins(coins, target);
    

    Tiếp theo, bạn sẽ cập nhật lệnh gọi để in Console.WriteLine giá trị chính result xác.

  2. Dẫn hướng đến cuộc Console.WriteLine gọi. Cập nhật mã của bạn để khớp với các mục sau:

    if (result.Length == 0) 
    {
        Console.WriteLine("No two coins make change");
    } 
    else 
    {
        Console.WriteLine("Change found at positions:");
        for (int i = 0; i < result.GetLength(0); i++) 
        {
            if (result[i,0] == -1) 
            {
                break;
            }
            Console.WriteLine($"{result[i,0]},{result[i,1]}");
        }
    }
    

    Ở đây, bạn giữ kiểm tra một mảng trống as-is, và in các giá trị của mảng 2D theo vòng lặp. Khi tìm -1 thấy một giá trị, bạn thoát khỏi vòng lặp vì không có cặp nào tiếp theo.

Kiểm tra công việc của bạn

Trong tác vụ này, bạn sẽ chạy ứng dụng của mình từ Thiết bị đầu cuối Tích hợp và xác minh rằng mã của bạn đang hoạt động đúng cách. Hãy bắt đầu.

  1. So sánh mã của bạn với các mã sau để đảm bảo mã chính xác:

    int target = 30;
    int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5};
    int[,] result = TwoCoins(coins, target);
    
    if (result.Length == 0) 
    {
        Console.WriteLine("No two coins make change");
    } 
    else 
    {
        Console.WriteLine("Change found at positions:");
        for (int i = 0; i < result.GetLength(0); i++) 
        {
            if (result[i,0] == -1) 
            {
                break;
            }
            Console.WriteLine($"{result[i,0]},{result[i,1]}");
        }
    }
    
    int[,] TwoCoins(int[] coins, int target) 
    {
        int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}};
        int count = 0;
    
        for (int curr = 0; curr < coins.Length; curr++) 
        {
            for (int next = curr + 1; next < coins.Length; next++) 
            {    
                if (coins[curr] + coins[next] == target) 
                {
                    result[count, 0] = curr;
                    result[count, 1] = next;
                    count++;
                }
                if (count == result.GetLength(0)) 
                {
                    return result;
                }
            }
        }
        return (count == 0) ? new int[0,0] : result;
    }
    
  2. Lưu công việc của bạn sử + Ctrl S hoặc sử dụng menu Tệp Mã Visual Studio.

  3. Nếu cần, hãy mở pa-nen Đầu cuối Tích hợp của Visual Studio Code.

    Trong pa nen EXPLORER, để mở Một Thiết bị đầu cuối tại vị trí thư mục TestProject của bạn, hãy bấm chuột phải vào TestProject, sau đó chọn Mở trong Thiết bị đầu cuối tích hợp.

  4. Tại dấu nhắc lệnh Terminal, hãy nhập dotnet chạy

  5. Xác minh rằng mã của bạn tạo ra đầu ra sau đây:

    Change found at positions:
    0,3
    0,4
    1,3
    1,4
    3,6
    

    Nếu mã của bạn hiển thị các kết quả khác nhau, bạn sẽ cần xem lại mã của mình để tìm lỗi và cập nhật. Chạy lại mã để xem bạn đã khắc phục sự cố chưa. Tiếp tục cập nhật và chạy mã của bạn cho đến khi mã của bạn tạo ra kết quả mong đợi.

  6. Tiếp theo, cập nhật giá trị target của thành giá trị của 80:

    int target = 80;
    
  7. Lưu công việc của bạn rồi nhập dotnet chạy tại dấu nhắc lệnh Thiết bị đầu cuối

  8. Để xác minh rằng mã của bạn đang hoạt động như mong đợi, hãy so sánh đầu ra của ứng dụng với đầu ra sau đây:

    No two coins make change
    

    Nếu mã của bạn hiển thị các kết quả khác nhau, bạn sẽ cần xem lại mã của mình để tìm lỗi và cập nhật. Chạy lại mã để xem bạn đã khắc phục sự cố chưa. Tiếp tục cập nhật và chạy mã của bạn cho đến khi mã của bạn tạo ra kết quả mong đợi.