华为OD机试真题---转盘寿司
时间: 2025-02-25 11:50:34 浏览: 85
### 华为OD机试 转盘寿司 编程题 解法
#### 题目描述
在一个寿司转盘上有 `n` 盘寿司,每盘寿司有一个对应的价格数组 `prices[]`。当顾客选择一盘寿司时,店铺会免费赠送距离该盘最近的一盘价格更低的寿司。如果不存在这样的寿司,则不赠送。
#### 思路分析
为了高效解决这个问题,可以采用栈来辅助处理。具体来说:
- 使用一个单调递减栈存储索引位置。
- 对于每一个新遇到的寿司,检查栈顶元素是否符合条件(即栈顶元素对应的寿司价格大于当前寿司),如果是则更新结果并弹出栈顶;否则继续压入新的索引到栈中。
这种方法能够在线性时间内完成计算,时间复杂度为 O(n),空间复杂度也为 O(n)。
#### Java 实现代码
```java
import java.util.*;
public class SushiTurntable {
public static int[] findFreeSushis(int[] prices) {
Stack<Integer> stack = new Stack<>();
int n = prices.length;
int[] result = new int[n];
Arrays.fill(result, -1); // 初始化result,默认值设为-1表示无匹配
for (int i = 0; i < n * 2; ++i) { // 循环两次模拟循环链表效果
while (!stack.isEmpty() && prices[stack.peek()] > prices[i % n]) {
result[stack.pop()] = i % n;
}
if (i < n) {
stack.push(i);
}
}
return result;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = "7\n3 8 5 6 9 4 1";
String[] inputs = input.split("\n");
int n = Integer.parseInt(inputs[0]);
int[] prices = Arrays.stream(inputs[1].split(" "))
.mapToInt(Integer::parseInt).toArray();
int[] freeSushisIndices = findFreeSushis(prices);
System.out.println(Arrays.toString(freeSushisIndices));
}
}
```
此程序实现了上述逻辑,并通过读取标准输入获取数据进行测试[^1]。
阅读全文
相关推荐
















