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作为最终的结果。
