当前位置: 首页 > news >正文

OD 算法题 B卷【阿里巴巴找黄金宝箱4】

文章目录

  • 阿里巴巴找黄金宝箱4

阿里巴巴找黄金宝箱4

  • 有1~N个箱子排成一个环,每个箱子有自己对应的编号;
  • 输出每一个箱子后第一个比自己编号大的数;
  • 找到的多个数以,分隔输出;

示例1:
输入:
2,5,2
输出
5,-1,5

示例2:
输入:
3,4,5,6,3
输出
4,5,6,-1,4

思路:

  • 数组复制一份,拼接在一起(每个数找一圈);
  • 单调栈,从栈顶到栈底,递增为单调递增栈;否则为单调递减栈;
  • 单调栈解决大小关系;

python实现:


arr = list(map(int, input().strip().split(",")))
n = len(arr)# 存储找到的第一个比自己大的数
arr2 = [-1 for i in range(n)]# 单调栈,存储当前的索引
stack = []
# 双份数组 或者 圆圈索引求模
double_arr = arr + arrfor i in range(2*n):cur_data = double_arr[i]while stack and cur_data > arr[stack[-1]]:# 找到当前比idx处大的第一个数cur_idx = stack.pop()arr2[cur_idx] = cur_data# 有效索引入栈 (>=n的索引无效)if i < n:# 索引入栈stack.append(i)arr2_str = map(str, arr2)
print(",".join(arr2_str))

java

import java.util.Scanner;
import java.util.*;
import java.lang.Integer;public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int[] nums = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();int len = nums.length;//将数组复制成双份数组([1,2,3] -> [1,2,3,1,2,3])int[] doubleNums = Arrays.copyOf( nums, len *2);System.arraycopy( nums, 0, doubleNums, len, len);//各位置对应第一个比他大的数int[] resInts = new int[len];//初始化为 -100001,因为宝箱数值范围 >= -100000,<=100000Arrays.fill( resInts, -100001);Deque<Integer> deque = new ArrayDeque<>();for(int i=0; i<len*2; i++){int num = doubleNums[i];System.out.println("55--" + num);//单调栈while (!deque.isEmpty() && num > nums[deque.peek()]){ // deque.peek() 访问栈顶//双向队列中有值,且最后一个值小于当前数字则取出//并通过队列中的索引,对 resInts 进行赋值System.out.println("出队" + num);int index = deque.pop(); // 弹出栈顶resInts[index] = num;}if(i < len){System.out.println("入队" + i);deque.push(i);}}String res = "";for(int i : resInts){if(i == -100001){//等于 -100001 说明不存在,则输出 -1i = -1;}res += i + ",";}System.out.println(res.substring( 0, res.length() - 1));}}

&nbsp;

相关文章:

  • Vue 与react 生命周期对比
  • 机器学习-02(深度学习的基本概念)
  • chapter02_AbstractBeanfactory与模板方法
  • 力扣第87题-扰乱字符串
  • 支持向量机(SVM)在医疗诊断:医学影像领域的应用与实现
  • 现代 JavaScript (ES6+) 入门到实战(八):总结与展望 - 成为一名现代前端开发者
  • 现代 JavaScript (ES6+) 入门到实战(五):告别回调地狱,Promise 完全入门
  • PCB工艺学习与总结-20250628
  • Ubuntu20 编译安装 Redis7.2.4
  • MySQL 安装使用教程
  • Ubuntu22 安装 RTX 5070 Ti Nvidia Driver 驱动
  • NeRF-Lidar实景重建:大疆Mavic 4 Pro低成本建模方案(2025实战指南)
  • docker启动xxl-job 网络问题
  • 解锁Ubuntu安装:从新手到高手的通关秘籍
  • 在Mac上查找并删除Java 21.0.5
  • 阶乘求和全解析:从 Python 秒过到 C++ 手写高精度
  • 【Redis#4】Redis 数据结构 -- String类型
  • 【如何实现分布式压测中间件】
  • 什么是区块哈希(Block Hash)
  • 图片元数据与防篡改技术指南