题解 | #牛群的喂养顺序# 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) { // write code here 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。
该题考察的知识点包括:
- 二维数组的使用
- 循环和条件语句的控制流
- 列表(List)和动态数组的操作
- 布尔值的运算
代码的文字解释如下:
- 布尔数组
access
和列表makeAccess
,用于记录奶牛的可访问状态和相互制约关系。 - 遍历二维数组
feedOrders
,根据其中的信息更新access
和makeAccess
数组:将 feedOrders[i][1] 对应的奶牛的可访问状态设置为 false。将 feedOrders[i][1] 加入到 feedOrders[i][0] 对应的奶牛的制约关系列表中。 - 创建一个变量
size
,初始值为奶牛数量numCows
。 - 使用
while
循环,在每次循环中遍历奶牛,并检查其可访问状态是否需要更新:如果奶牛的可访问状态为 true,则跳过当前循环。否则,遍历该奶牛的制约关系列表,检查每头奶牛的可访问状态是否为 false:如果存在任意一头奶牛的可访问状态为 false,将 flag 设置为 false 并跳出循环。否则,将 flag 设置为 true 并更新当前奶牛的可访问状态为 true。 - 每次循环结束后,将
size
减 1。 - 循环结束后,遍历
access
数组,如果存在任意一头奶牛的可访问状态为false
,返回false
。 - 如果所有奶牛的可访问状态都为
true
,返回true
。