Java 题解 | #牛群的喂养顺序#
牛群的喂养顺序
https://www.nowcoder.com/practice/ce8860b6a8c74dfd8ccd15998970e447
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param numCows int整型 * @param feedOrders int整型二维数组 * @return bool布尔型 */ public boolean canFeedAllCows(int numCows, int[][] feedOrders) { boolean[] access = new boolean[numCows]; List<List<Integer>> makeAccess = new ArrayList<>(); for (int i = 0; i < numCows; ++i) { access[i] = true; makeAccess.add(new ArrayList<>()); } for (int i = 0; i < feedOrders.length; ++i) { access[feedOrders[i][1]] = false; makeAccess.get(feedOrders[i][0]).add(feedOrders[i][1]); } int size = numCows; while (size-- > 0) { for (int i = 0; i < numCows; ++i) { if (access[i]) continue; else { boolean flag = true; for (int j = 0; j < makeAccess.get(i).size(); ++j) { if (!access[makeAccess.get(i).get(j)]) { flag = false; break; } } if (flag) access[i] = true; } } } for (int i = 0; i < numCows; ++i) { if (!access[i]) return false; } return true; } }
该代码使用的编程语言是Java。
该题表达的知识点:
- 二维数组:使用
int[][]
表示二维整数数组。 - 列表:使用
List
和ArrayList
来动态管理列表。 - 循环:使用
for
循环遍历数组和列表。 - 条件判断:使用
if-else
语句根据条件执行不同的代码。 - 布尔类型:使用
boolean
表示布尔类型变量,用于判断条件。
代码的文字解释大纲如下:
- 定义一个函数
canFeedAllCows
,参数为牛的数量numCows
和喂养订单的二维数组feedOrders
。 - 创建一个布尔数组
access
,用于记录每头牛是否能被喂养,默认都为true
。 - 创建一个二维列表
makeAccess
,用于记录每个牛制造饲料的牛的索引。 - 遍历
feedOrders
数组,更新access
数组和makeAccess
列表的值。将feedOrders[i][1]索引对应的牛设置为不能被喂养(false)。将feedOrders[i][0]索引对应的牛添加到makeAccess[feedOrders[i][0]]列表中。 - 定义变量
size
,初始值为numCows
。 - 使用
while
循环,遍历每一个牛。如果某头牛i能够被喂养(access[i] == true)则跳过。否则,对于每个制造饲料的牛的索引j,如果有任何一头牛makeAccess[i][j]不能被喂养,则将flag置为false。如果所有制造饲料的牛都可以被喂养,则将当前牛i设置为可以被喂养(access[i] = true)。 - 遍历
access
数组,如果存在任何一头牛不能被喂养(access[i] == false
),则返回false
。 - 如果所有牛都可以被喂养,则返回
true
作为结果。