Java 题解 | #牛的生长情况#
牛的生长情况
https://www.nowcoder.com/practice/5f67258999bd4e61a361f4d3017a3fd4
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param weights int整型一维数组 * @return int整型一维数组 */ public int[] weightGrowth (int[] weights) { // write code here int n = weights.length; int[] res = new int[n]; Deque<Integer> stack = new ArrayDeque<>(); // 遍历数组 for (int i = 0; i < n; i++) { // 弹出比当前元素小的栈顶元素,并计算增长距离 while (!stack.isEmpty() && weights[stack.peek()] < weights[i]) { int x = stack.pop(); res[x] = i - x; } // 将当前元素入栈 stack.push(i); } // 处理栈中剩余的元素,设置增长距离为-1 while (!stack.isEmpty()) { res[stack.pop()] = -1; } return res; } }
该代码使用的编程语言是Java。
该题表达的知识点是栈的应用。给定一个整型数组weights
,要求计算出每个元素的增长距离。具体实现如下:
- 创建一个栈,用来保存数组中的索引。
- 遍历数组
weights
,对于每个元素:如果栈不为空并且栈顶元素对应的数组元素小于当前元素,则将栈顶元素弹出,计算弹出元素的增长距离,并将结果保存到对应的输出数组res中。将当前元素的索引入栈。 - 遍历完数组后,如果栈中还有剩余元素,说明这些元素没有更大的下一个元素,所以将对应的输出数组
res
中的值设为-1。 - 返回输出数组
res
。
代码的文字解释如下:
- 创建一个栈
stack
和一个数组res
,长度都为输入数组weights
的长度。 - 遍历输入数组
weights
的每一个元素:如果栈不为空并且栈顶元素对应的数组元素小于当前元素,表示发现了比栈顶元素更大的元素,需要将栈顶元素弹出并计算增长距离。弹出栈顶元素的索引x。计算增长距离为当前索引i减去弹出的索引x。将计算得到的增长距离保存到输出数组res的对应位置x上。将当前元素的索引入栈。 - 遍历完输入数组后,检查栈是否为空:如果栈不为空,则表示栈中剩余元素没有更大的下一个元素。需要将剩余元素的增长距离设为-1,并将结果保存到输出数组res的对应位置上。
- 返回输出数组
res
作为最终的结果。