แบบฝึกหัด - ส่งกลับอาร์เรย์จากวิธีการ
เมื่อพัฒนาแอปพลิเคชัน คุณมักจําเป็นต้องสร้างและปรับเปลี่ยนชุดข้อมูล วิธีการนี้มีประโยชน์สําหรับการดําเนินการกับข้อมูล และเป็นเครื่องมือที่มีประสิทธิภาพอย่างยิ่งสําหรับการสร้างชุดข้อมูลด้วยตนเอง การพัฒนาวิธีการเพื่อสร้างอาร์เรย์ที่แสดงชุดข้อมูลของคุณช่วยให้โค้ดของคุณสามารถนํามาใช้ใหม่ จัดระเบียบ และทําให้ง่ายขึ้น ในแบบฝึกหัดนี้ คุณจะได้ฝึกส่งกลับอาร์เรย์จากวิธีการ
ค้นหาเหรียญเพื่อทําการเปลี่ยนแปลง
สมมติว่าคุณมีเหรียญของค่าที่แตกต่างกันหลายเหรียญ คุณได้รับมอบหมายให้หาเหรียญสองตัวที่มีผลรวมเท่ากับค่าเป้าหมาย ในแบบฝึกหัดนี้ เหรียญที่พร้อมใช้งานจะแสดงในอาร์เรย์จํานวนเต็ม คุณจะต้องส่งกลับดัชนีของสองเหรียญในอาร์เรย์ใหม่ มาเริ่มต้นกันเลย!
ใน Visual Studio Code Editor ให้ลบโค้ดที่มีอยู่ออกจากแบบฝึกหัดก่อนหน้า
ป้อนรหัสต่อไปนี้ลงในตัวแก้ไขรหัส Visual Studio:
int[] TwoCoins(int[] coins, int target) { return new int[0]; }ในกรณีที่ไม่พบเหรียญสองเหรียญ วิธีการของคุณจะส่งกลับอาร์เรย์ว่าง ใช้เวลาสักครู่เพื่อพิจารณาไวยากรณ์ของผลลัพธ์ที่ส่งกลับ แม้ว่าคุณจะสามารถสร้างตัวแปรเพื่อจัดเก็บอาร์เรย์ใหม่
int[]และส่งกลับตัวแปรได้ แต่returnคําสั่ง จะช่วยให้คุณสามารถสร้างและส่งกลับค่าได้ในเวลาเดียวกันมีหลายวิธีในการแก้ปัญหานี้ ใช้เวลาสักครู่เพื่อพิจารณาว่าคุณอาจค้นหาตัวเลขสองตัวในอาร์เรย์ที่มีผลรวมเท่ากับค่าที่กําหนดได้อย่างไร
ในแบบฝึกหัดนี้ จะใช้วิธีการต่อไปนี้:
- เลือกตัวเลขหนึ่งตัวจากอาร์เรย์
- ตรวจสอบตัวเลขอื่นๆ ทีละครั้งเพื่อดูว่ามีการเพิ่มค่าเป้าหมายหรือไม่
- ส่งกลับผลลัพธ์ทันทีที่พบรายการที่ตรงกัน
หากต้องการตรวจสอบแต่ละหมายเลขในอาร์เรย์ ให้
TwoCoinsอัปเดตวิธีการ ด้วยรหัสต่อไปนี้: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]; }currที่นี่ แสดงดัชนีเหรียญคงที่หนึ่งดัชนีและnextแสดงดัชนีเหรียญที่ตามมา คุณจะลองเพิ่มแต่ละnextเหรียญด้วยเหรียญคงที่currเพื่อดูว่าเท่ากับค่าเป้าหมายหรือไม่ถัดไป ให้เพิ่มตรรกะเพื่อตรวจสอบผลรวมของสองเหรียญสําหรับค่าเป้าหมาย เมื่อต้องการทําเช่นนั้น ให้อัปเดตการวนรอบก่อนหน้า
forด้วยโค้ดต่อไปนี้: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}; } } }ในรหัสนี้ คุณกําลังตรวจสอบว่าผลรวมของค่าที่
currและnextในอาร์เรย์ เท่ากับค่าเป้าหมายหรือไม่ ถ้าผลรวมเท่ากัน คุณสร้างอาร์เรย์เพื่อจัดเก็บดัชนีเหล่านั้นและส่งกลับ ถ้าไม่เท่ากัน คุณสามารถเพิกเฉยต่อและทําการตรวจสอบต่อไปได้
ทดสอบโซลูชันของคุณ
ในขั้นตอนนี้ คุณจะทดสอบโค้ดของคุณเพื่อให้แน่ใจว่ารหัสทํางานได้อย่างถูกต้อง ก่อนอื่น คุณจะเตรียมใช้งานตัวแปรบางอย่างเพื่อจัดเก็บข้อมูลที่ป้อนเข้า จากนั้นคุณจะเรียกใช้เมธอด และพิมพ์ผลลัพธ์
สร้างบรรทัดรหัสว่างใหม่เหนือ
TwoCoinsลายเซ็นวิธีการ จากนั้นป้อนรหัสต่อไปนี้:int target = 60; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[] result = TwoCoins(coins, target);โปรดจําไว้ว่า
TwoCoinsวิธีการ จะส่งกลับอาร์เรย์ว่างถ้าไม่พบการเปลี่ยนแปลง คุณจะต้องตรวจสอบขนาดอาร์เรย์ก่อนที่จะพยายามพิมพ์resultอาร์เรย์ป้อนบรรทัดรหัสว่างใหม่ จากนั้นป้อนรหัสต่อไปนี้:
if (result.Length == 0) { Console.WriteLine("No two coins make change"); } else { Console.WriteLine($"Change found at positions {result[0]} and {result[1]}"); }หากจําเป็น ให้เปิดแผงเทอร์มินัลแบบรวมของ Visual Studio Code
ที่พร้อมท์คําสั่งเทอร์มินัล ให้ใส่ dotnet run เปรียบเทียบเอาต์พุตของคุณดังต่อไปนี้:
Change found at positions 2 and 5หากรหัสของคุณแสดงผลลัพธ์ที่ไม่คาดคิด คุณจะต้องตรวจสอบรหัสของคุณเพื่อค้นหาข้อผิดพลาดและทําการอัปเดต เรียกใช้รหัสอีกครั้งเพื่อดูว่าคุณได้แก้ไขปัญหาหรือไม่ อัปเดตและเรียกใช้โค้ดของคุณต่อจนกว่ารหัสของคุณจะสร้างผลลัพธ์ที่คาดหวัง
ค้นหาเหรียญหลายคู่ที่สร้างการเปลี่ยนแปลง
ในขั้นตอนนี้ คุณจะขยาย TwoCoins วิธีการเพื่อค้นหาคู่ของเหรียญเพิ่มเติมที่มีผลรวมเท่ากับค่าเป้าหมาย สําหรับแบบฝึกหัดนี้ คุณจะพบห้าคู่สูงสุด ซึ่งหมายความว่าชนิดผลลัพธ์จะเป็นอาร์เรย์ 2D แทนที่จะเป็นอาร์เรย์ 1D และคุณจะต้องปรับเปลี่ยนวิธีที่รหัสของคุณส่งกลับผลลัพธ์ มาเริ่มต้นกันเลย!
เปลี่ยนชนิดการส่งกลับในลายเซ็นวิธีการ จาก
int[]ไปเป็นint[,]โดยการอัปเดตรหัสของคุณดังต่อไปนี้:int[,] TwoCoins(int[] coins, int target)ถัดไป คุณจะสร้าง
int[,]อาร์เรย์เพื่อจัดเก็บและส่งกลับผลลัพธ์ของคุณ และตัวแปรตัวนับเพื่อติดตามจํานวนคู่ที่เพิ่มลงในอาร์เรย์อัปเดตวิธีการ
TwoCoinsด้วยโค้ดต่อไปนี้:int[,] TwoCoins(int[] coins, int target) { int[,] result = {{-1,-1},{-1,-1},{-1,-1},{-1,-1},{-1,-1}}; int count = 0;โปรดสังเกตว่า คุณได้เตรียมใช้งานองค์ประกอบอาร์เรย์ผลลัพธ์เป็น
-1ซึ่งจะช่วยให้คุณสามารถพิมพ์คู่ที่พบในภายหลังได้ถัดไป คุณจะใช้
resultอาร์เรย์เพื่อจัดเก็บคู่ที่พบแต่ละรายการแทนที่จะส่งคืนค่าที่ตรงกันครั้งแรกอัปเดตวิธีการ
TwoCoinsด้วยโค้ดต่อไปนี้: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++; } } }โปรดสังเกตว่า
countจะเพิ่มหน่วยทุกครั้งที่มีการเพิ่มคู่ลงในอาร์เรย์ ซึ่งอาจทําให้เกิดข้อผิดพลาดดัชนีนอกขอบเขตถ้ามีมากกว่าห้าคู่ เพื่อป้องกันข้อผิดพลาดนี้ คุณสามารถเพิ่มรหัสเพื่อตรวจสอบค่าของcountและส่งกลับผลลัพธ์ของresultอาร์เรย์ ที่ถูกกรอกอัปเดตตรรกะใน
TwoCoinsวิธีการ ด้วยโค้ดต่อไปนี้: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ในTwoCoinsวิธีการ ปรับเปลี่ยนคําสั่งreturnให้ตรงกับโค้ดต่อไปนี้:if (count == 0) { return new int[0,0]; } return result;คุณยังสามารถย่อรหัสส่งกลับนี้โดยใช้ตัวดําเนินการ ternary เช่น:
return (count == 0) ? new int[0,0] : result;สําคัญ
ความยืดหยุ่นของ
returnคําหลักช่วยให้คุณสามารถส่งกลับค่าของนิพจน์ได้ ตราบใดที่ผลลัพธ์ตรงกับชนิดผลลัพธ์ที่ระบุของวิธีการในตอนนี้
TwoCoinsเมธอด ควรตรงกับโค้ดต่อไปนี้: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; }
จับภาพอาร์เรย์ส่งกลับใหม่
ตอนนี้วิธีการของคุณส่งคืนอาร์เรย์ 2D แล้ว คุณสามารถอัปเดตรหัสของคุณเพื่อดึงและพิมพ์ผลลัพธ์ได้ เนื่องจากมีการเตรียมใช้งานองค์ประกอบอาร์เรย์ผลลัพธ์ไปยัง -1คุณสามารถเพิ่มการตรวจสอบเพื่อพิมพ์คู่ทั้งหมดจนกว่าจะ -1 พบค่า
นําทางไปยังจุดเริ่มต้นของโปรแกรมของคุณที่มี
targetการกําหนดตัวแปร ปรับเปลี่ยนโค้ดของคุณดังต่อไปนี้:int target = 30; int[] coins = new int[] {5, 5, 50, 25, 25, 10, 5}; int[,] result = TwoCoins(coins, target);ถัดไป คุณจะอัปเดตการเรียกเพื่อให้
Console.WriteLineพิมพ์resultค่าอย่างถูกต้องนําทางไปยัง
Console.WriteLineการโทร อัปเดตโค้ดของคุณเพื่อให้ตรงกับรายการต่อไปนี้: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]}"); } }ที่นี่ คุณตรวจสอบอาร์เรย์ที่ว่างเปล่า as-isและพิมพ์ค่าของอาร์เรย์ 2D ใน for-loop
-1เมื่อพบค่า คุณจะแยกออกจากรอบเนื่องจากไม่มีคู่ถัดไป
ตรวจสอบงานของคุณ
สําหรับงานนี้ คุณจะเรียกใช้แอปพลิเคชันของคุณจากเทอร์มินัลรวมและตรวจสอบว่ารหัสของคุณทํางานได้อย่างถูกต้อง มาเริ่มต้นกันเลย
เปรียบเทียบโค้ดของคุณกับโค้ดต่อไปนี้เพื่อให้แน่ใจว่าถูกต้อง:
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; }บันทึกงานของคุณโดยใช้ Ctrl + S หรือใช้เมนูไฟล์ของ Visual Studio Code
หากจําเป็น ให้เปิดแผงเทอร์มินัลแบบรวมของ Visual Studio Code
ในแผง EXPLORER หากต้องการเปิดเทอร์มินัลที่ตําแหน่งโฟลเดอร์ TestProject ของคุณ ให้คลิกขวาที่ TestProject จากนั้นเลือก เปิดในเทอร์มินัลแบบรวม
ที่พร้อมท์คําสั่งเทอร์มินัล ให้ใส่ dotnet ทํางาน
ตรวจสอบว่าโค้ดของคุณสร้างเอาต์พุตต่อไปนี้:
Change found at positions: 0,3 0,4 1,3 1,4 3,6หากรหัสของคุณแสดงผลลัพธ์ที่แตกต่างกัน คุณจะต้องตรวจสอบรหัสของคุณเพื่อค้นหาข้อผิดพลาดและทําการอัปเดต เรียกใช้รหัสอีกครั้งเพื่อดูว่าคุณได้แก้ไขปัญหาหรือไม่ อัปเดตและเรียกใช้โค้ดของคุณต่อจนกว่ารหัสของคุณจะสร้างผลลัพธ์ที่คาดหวัง
ถัดไป อัปเดตค่า ของ
targetเป็นค่าของ80:int target = 80;บันทึกงานของคุณ จากนั้นป้อน dotnet ทํางาน ที่พรอมต์คําสั่งเทอร์มินัล
เพื่อตรวจสอบว่าโค้ดของคุณทํางานตามที่คาดไว้หรือไม่ ให้เปรียบเทียบเอาต์พุตของแอปพลิเคชันของคุณกับเอาต์พุตต่อไปนี้:
No two coins make changeหากรหัสของคุณแสดงผลลัพธ์ที่แตกต่างกัน คุณจะต้องตรวจสอบรหัสของคุณเพื่อค้นหาข้อผิดพลาดและทําการอัปเดต เรียกใช้รหัสอีกครั้งเพื่อดูว่าคุณได้แก้ไขปัญหาหรือไม่ อัปเดตและเรียกใช้โค้ดของคุณต่อจนกว่ารหัสของคุณจะสร้างผลลัพธ์ที่คาดหวัง